2017-03-24 68 views
1

是否存在對此的「應用」應用程序,而不是基於R中的兩個數據幀的每一行進行雙循環(不使用包)?對列表中的每個元素和兩個數據幀的每一行應用函數

listD <- matrix(1:6, ncol=2) 
listD <- split(listD,seq(NROW(listD))) 
df1 <- data.frame(x=c(1,2), y=c(3,4)) 
df2 <- data.frame(x=c(3,2), y=c(1,1)) 
testFunc <- function(a, b, c) a * (b + c) 

for (j in 1:nrow(df1)) { 
    for (s in 1:nrow(df2)) { 
    print(lapply(listD, FUN= testFunc, b=df1[j,], c=df2[s,])) 
    } 
} 

謝謝!

回答

1

使用outer其副作用:

invisible(outer(as.matrix(df1), as.matrix(df2), FUN = Vectorize(function (b, c) { 
    print(lapply(listD, testFunc, b, c)) 
    NULL 
}))) 

我不知道這是不是你的for循環的改善。有一個神話,R的循環必須避免不惜一切代價(也許他們看起來太簡單了?)

+0

謝謝你dash2!我不知道外面!你能解釋爲什麼我需要「隱形」和「空白」(如果我不使用NULL,我得到一個錯誤)...也...我怎麼保存這個?謝謝!! – user971102

+0

您需要它,否則它會嘗試將結果打印爲矩陣,但不會。使用'outer'保存結果很困難,因爲您不能將結果作爲矩陣返回。你可能想要進入內部:將'lapply'放在'outer'外面並返回一個矩陣列表。 – dash2

+0

好的,如果循環和應用之間沒有區別,那麼我會堅持循環,因爲它更清晰(至少對我來說現在...) – user971102

相關問題