gpt4 book ai didi

r - 内存和矢量化自定义函数

转载 作者:行者123 更新时间:2023-12-02 00:22:16 25 4
gpt4 key购买 nike

我想知道如何在 R 中对自定义函数进行矢量化和内存。似乎
我的思维方式与 R 的操作方式不一致。所以,我很高兴
欢迎任何指向好的阅读 Material 的链接。例如,R inferno 是一个不错的
资源,但它并没有帮助弄清楚 R 中的内存。

更一般地说,您能否提供 memoise 的相关用法示例?
R.cache包?

我还没有找到关于这个主题的任何其他讨论。搜索
r-bloggers.com 上的“memoise”或“memoize”返回零结果。搜索
对于那些位于 http://r-project.markmail.org/ 的关键字没有帮助
讨论。我通过电子邮件发送了邮件列表,但没有收到完整的
回答。

我不仅对内存 GC 功能感兴趣,而且我知道
Bioconductor和各种包装
在那里可用。

这是我的数据:

seqs <- c("","G","C","CCC","T","","TTCCT","","C","CTC")

缺少某些序列,因此它们为空白 "" .

我有一个计算 GC 内容的函数:
> GC <- function(s) {
if (!is.character(s)) return(NA)
n <- nchar(s)
if (n == 0) return(NA)
m <- gregexpr('[GCSgcs]', s)[[1]]
if (m[1] < 1) return(0)
return(100.0 * length(m) / n)
}

有用:
> GC('')
[1] NA
> GC('G')
[1] 100
> GC('GAG')
[1] 66.66667
> sapply(seqs, GC)
G C CCC T TTCCT
NA 100.00000 100.00000 100.00000 0.00000 NA 40.00000 NA
C CTC
100.00000 66.66667

我想记住它。然后,我想对其进行矢量化。

显然,我一定有错误的心态来使用 memoise或者 R.cache R包:
> system.time(dummy <- sapply(rep(seqs,100), GC))
user system elapsed
0.044 0.000 0.054
>
> library(memoise)
> GCm1 <- memoise(GC)
> system.time(dummy <- sapply(rep(seqs,100), GCm1))
user system elapsed
0.164 0.000 0.173
>
> library(R.cache)
> GCm2 <- addMemoization(GC)
> system.time(dummy <- sapply(rep(seqs,100), GCm2))
user system elapsed
10.601 0.252 10.926

请注意,内存函数要慢几个数量级。

我试过 hash包,但事情似乎在后面发生
场景,我不明白输出。序列 C应该有一个 100 的值,而不是 NULL .

请注意,使用 has.key(s, cache)而不是 exists(s, cache)结果
在同一个输出中。此外,使用 cache[s] <<- result代替 cache[[s]] <<- result结果相同的输出。
> cache <- hash()
> GCc <- function(s) {
if (!is.character(s) || nchar(s) == 0) {
return(NA)
}
if(exists(s, cache)) {
return(cache[[s]])
}
result <- GC(s)
cache[[s]] <<- result
return(result)
}
> sapply(seqs,GCc)
[[1]]
[1] NA

$G
[1] 100

$C
NULL

$CCC
[1] 100

$T
NULL

[[6]]
[1] NA

$TTCCT
[1] 40

[[8]]
[1] NA

$C
NULL

$CTC
[1] 66.66667

至少我想出了如何矢量化:
> GCv <- Vectorize(GC)
> GCv(seqs)
G C CCC T TTCCT
NA 100.00000 100.00000 100.00000 0.00000 NA 40.00000 NA
C CTC
100.00000 66.66667

相关stackoverflow帖子:
  • Options for caching / memoization / hashing in R
  • 最佳答案

    虽然这不会让您在通话中内存,但如果有相当多的重复,您可以使用因素来更快地进行单个通话。例如使用 Joshua 的 GC2 (虽然我必须删除 fixed=T 才能让它工作):

    GC2 <- function(s) {
    if(!is.character(s)) stop("'s' must be character")
    n <- nchar(s)
    m <- gregexpr('[GCSgcs]', s)
    len <- sapply(m, length)
    neg <- sapply(m, "[[", 1)
    len <- len*(neg > 0)
    100.0 * len/n
    }

    可以轻松定义一个包装器,例如:
    GC3 <- function(s) {
    x <- factor(s)
    GC2(levels(x))[x]
    }

    system.time(GC2(rep(seqs, 50000)))
    # user system elapsed
    # 8.97 0.00 8.99
    system.time(GC3(rep(seqs, 50000)))
    # user system elapsed
    # 0.06 0.00 0.06

    关于r - 内存和矢量化自定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10404505/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com