2013-08-12 54 views
2
Z = data.frame(var1 = c(1,2,3,4,5), var2 = LETTERS[1:5]) 

testfun <- function(x){ 
    print(x) # prints the data 
    # but how to get names of the list coming in? 
    return(NULL) 
} 

res = lapply(Z, testfun) 

我想訪問testfun中的變量「var1」和「var2」。如何在testfun中檢索這些變量?樂博甚至傳遞了這些信息嗎? colnames(x)不起作用。如何檢索使用lapply傳遞給函數的列表的名稱

+0

有了'lapply',你傳遞單獨的列的功能。在這種情況下,我不確定變量名是否有意義。除非,你想根據變量名來操作'Z',在這種情況下,我會做'lapply(名字(Z),FUN = function(x,my.df){},my.df = Z)'。另一種選擇是使用'mapply(Z,names(Z),FUN = function(x,y){...})'。 –

+0

也許(恐怖!:-))寫一個'for'循環。對於(1中的j:長度(Z)){print(Z [[j]]);打印(名稱(Z)[j])}' –

+0

謝謝羅馬。這就是羅蘭指出的,我知道我可以做到這一點。但我不確定是否通過複製(如果它在每個調用中複製)傳遞一個大的Z到testfun。 Yup Carl。 Yup Carl。可以做到這一點,:)存儲在一個env中,並從testfun調用它。只是想保持我的代碼非常精簡,並儘可能地在函數和函數調用中進行操作。這是一個非常大的生產級代碼庫,並且有助於提高可讀性。 – user1971988

回答

3

不,lapply不會將此信息傳遞給該函數。您可以沿着名稱lapply並使用子集來獲取函數內的列表內容。

testfun <- function(nam, mylist){ 
    print(nam) # prints the names 
    mylist[[nam]] #get list content using subsetting 
} 

res <- lapply(names(Z), testfun, mylist=Z) 
# [1] "var1" 
# [1] "var2" 

res 
# [[1]] 
# [1] 1 2 3 4 5 
# 
# [[2]] 
# [1] A B C D E 
# Levels: A B C D E 
+0

謝謝。這意味着每次都將整個Z傳遞給testfun? – user1971988

+0

實際上,經過一些測試後,我不認爲它每次都會通過。通過橢圓傳遞的參數變成了lapply調用的環境變量的局部變量,並且函數的實際評估從這個環境中獲得。製作了多少份,比我更聰明的人需要檢查。 – Roland

+0

是的。我不知道如何進行檢查,但我會盡力去做。我必須傳遞一個大數據框作爲參數,但是我並沒有操縱數據框中的任何內容(只是對要處理的列進行子集劃分),在這種情況下,我認爲不會創建副本。謝謝你的幫助。 – user1971988

2

類似@羅蘭的答案,我只想做1:length(Z)的申請,並通過列表,該列表名稱的功能。

nams <- names(Z) 
testfun <- function(i,Z,nams){ 
print(Z[[i]]) 
print(nams[i])} 

res <- lapply(1:length(Z),testfun,Z=Z,nams=nams) 

如果你只是想保存標籤,你可以使用llplyplyr包。

testfun <- function(x){x} 
res <- llply(Z,testfun) 
res 

結果將是:

> res 
$var1 
[1] 1 2 3 4 5 

$var2 
[1] A B C D E 
Levels: A B C D E 
+0

謝謝@振雷。感謝您的迴應,但我已經使用了羅蘭的方法。上次我檢查plyr包時速度很慢,而且我有大量數據框,有近百萬行。 – user1971988

相關問題