[英]Function, Vectors, and Loops in R
我最近開始嘗試使用R作為一種用於基因編程的語言。 我一直在緩慢而肯定地學習越來越多的有關R如何工作及其最佳編碼實踐的知識。 但是,我遇到了障礙。 這是我的情況。 我有一個大約700行的數據集,每行有400左右列。 我進行了所有設置,將具有與列數相同的多個參數的函數作為參數發送到評估(適應性評分)函數中。 我想在數據集中逐行並將行中每一列中的值傳遞給要評估的函數。 第一個問題是弄清楚如何將參數分別傳遞給函數。 “分別”是指該函數需要400個參數,而不是長度為400的向量。為此,我使用了以下命令:
do.call(function,as.list(parameters))
其中parameter是月份變量(1-12)的向量,該變量附加到數據集中一行中的值。 效果很好,我只使用了一個for循環對數據集中的700行進行迭代,然后對12個月進行了另一個循環,並使用上述累積了輸出向量。 問題是這非常緩慢,每個功能大約需要24-28秒。 每一代我都有100-500個函數發送到此評估中。 最重要的是這不是要走的路。 接下來,我嘗試使用如下的sapply方法。
outputs <- sapply(1:12,function(m) sapply(rows[1:length(rows)],function(p) do.call(f,as.list(c(p,m)))))
這應用(1-12)作為月份,然后應用(1-700)作為數據集的行。 這花了很長時間。 關於解決方案的任何想法都會有所幫助。
這種情況下的主要問題通常是您采用的方法是錯誤的。 我對您的具體情況還不了解,但是:
編輯由於生成了函數,因此您應該能夠生成采用值向量而不是那么多參數的不同版本。 請注意,您傳遞的向量可以具有名稱:
# Convert this:
f <- function(foo, bar) {
foo+bar
}
do.call(f, list(foo=42, bar=13))
# To this:
f <- function(args) {
args[["foo"]] + args[["bar"]]
# or even faster:
#args[[0]] + args[[1]]
# or fastest:
#sum(args)
}
do.call(f, list(args=c(foo=42, bar=13)))
# or, simply
f(c(foo=42, bar=13))
...用1個參數而不是400調用一個函數快60倍 ! 但是請注意,這只是調用該函數的開銷。 您還需要測量實際功能需要花費多少時間。 如果那需要一秒鍾或更長時間,那么調用它的效率或循環的效率都無所謂...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.