2017-05-11 83 views
4

我正在閱讀Wickham的高級R書。這個問題涉及解決第12章中的問題5 - 功能。練習要求我們執行以下操作:lapply中的匿名函數

實施一個版本的lapply(),該版本爲FUN提供每個組件的名稱和值。

現在,當我運行下面的代碼時,我得到了一列的預期答案。

c(class(iris[1]),names(iris[1])) 

輸出是:在上面的代碼

"data.frame" "Sepal.Length" 

大廈,這裏就是我所做的:

lapply(iris,function(x){c(class(x),names(x))}) 

但是,我只能從class(x)而不是從names(x)得到的輸出。爲什麼會這樣?

我也試過paste()看它是否有效。

lapply(iris,function(x){paste(class(x),names(x),sep = " ")}) 

我只在輸出中得到class(x)。我沒有看到names(x)正在退回。

爲什麼會出現這種情況?另外,我該如何解決它?

有人可以幫我嗎?

+4

矢量沒有'names'屬性。比較名稱(iris [1])和名稱(iris [,1])'(第一個是數據幀,而第二個是矢量)。如果你給它一些有意義的東西,比如'lapply(iris,function(x){c(class(x),length(x))})',你的函數就可以工作。此外,SO的目標是創建一個知識數據庫,以幫助未來的讀者,而不僅僅是你。因此,諸如「祕密花園中的神祕功能」這樣的標題是不可搜索的,因此對除了你自己以外的任何人都沒有幫助。 –

+0

@David。謝謝。我確實改變了標題。我對此表示歉意。無論如何,我可以獲得個人專欄名稱嗎?我會很感激你的幫助。 – watchtower

+1

@DavidArenburg「一個向量沒有名字屬性。」在這個例子中沒有,但是vector *可以具有'names'屬性:'setNames(1:3,letters [1:3])'。 – Roland

回答

2

而不是去通過數據幀直接,你可以切換周圍的事物,並lapply走在列名的載體,

data(iris) 

lapply(colnames(iris), function(x) c(class(iris[[x]]), x)) 

或以上的指數爲列,引用的數據幀。

lapply(1:ncol(iris), function(x) c(class(iris[[x]]), names(iris[x]))) 

注意使用單方括號和雙方括號。
iris[[n]]引用列表iris中的第012個對象(數據框只是一種特定類型的列表)的值,剝離所有屬性,使得像mean(iris[[1]])這樣的東西成爲可能。
iris[n]參考n th對象本身,所有屬性保持不變,使得像names(iris[1])可能。