2012-01-28 56 views
22

我有一個對象列表。我如何從列表中獲取一個對象的名稱?如在:從列表中提取對象的名稱

LIST <- list(A=1:5, B=1:10) 
LIST$A 
some.way.cool.function(LIST$A) #function I hope exists 
"A" #yay! it has returned what I want 

名稱(LIST)不正確,因爲它返回「A」和「B」。

只是爲了上下文我繪製了一系列存儲在列表中的數據幀。當我來到每個data.frame我想包括data.frame的名稱作爲標題。所以名稱(LIST)[1]的答案也是不正確的。

編輯:我添加的代碼爲更多的上下文的問題

x <- c("yes", "no", "maybe", "no", "no", "yes") 
y <- c("red", "blue", "green", "green", "orange") 
list.xy <- list(x=x, y=y) 

WORD.C <- function(WORDS){ 
require(wordcloud) 

L2 <- lapply(WORDS, function(x) as.data.frame(table(x), stringsAsFactors = FALSE)) 

    FUN <- function(X){ 
     windows() 
     wordcloud(X[, 1], X[, 2], min.freq=1) 
     mtext(as.character(names(X)), 3, padj=-4.5, col="red") #what I'm trying that isn't working 
    } 
    lapply(L2, FUN) 
} 

WORD.C(list.xy) 

如果這個作品的名字x和y會是紅色的兩條曲線

+0

但是,但是,但是...你從來沒有給一個名字到data.frame。我們應該如何打印一些不存在的東西? – 2012-01-28 22:50:45

+0

@DWin true,但是當我將向量包裝到一個表和數據框中時,它將保留L2中的原始向量名稱。 'L2'和'name(L2)'之後的'browser()'顯示這個'Browse [1]>名稱(L2) [1]「x」「y」 – 2012-01-28 23:18:09

+0

所以你想要列名或名稱的對象? – 2012-01-28 23:24:50

回答

8

製作一個小調整到內部功能和使用lapply的索引,而不是實際列表本身得到這個做你想做

x <- c("yes", "no", "maybe", "no", "no", "yes") 
y <- c("red", "blue", "green", "green", "orange") 
list.xy <- list(x=x, y=y) 

WORD.C <- function(WORDS){ 
    require(wordcloud) 

    L2 <- lapply(WORDS, function(x) as.data.frame(table(x), stringsAsFactors = FALSE)) 

    # Takes a dataframe and the text you want to display 
    FUN <- function(X, text){ 
    windows() 
    wordcloud(X[, 1], X[, 2], min.freq=1) 
    mtext(text, 3, padj=-4.5, col="red") #what I'm trying that isn't working 
    } 

    # Now creates the sequence 1,...,length(L2) 
    # Loops over that and then create an anonymous function 
    # to send in the information you want to use. 
    lapply(seq_along(L2), function(i){FUN(L2[[i]], names(L2)[i])}) 

    # Since you asked about loops 
    # you could use i in seq_along(L2) 
    # instead of 1:length(L2) if you wanted to 
    #for(i in 1:length(L2)){ 
    # FUN(L2[[i]], names(L2)[i]) 
    #} 
} 

WORD.C(list.xy) 
+0

謝謝你,完美的作品。我認爲可能會有一種解決方案,但我的麪條不可能這樣想。 – 2012-01-28 23:11:36

53

是的,它存在的頂部:)只要使用

> names(LIST) 
[1] "A" "B" 

顯然,第一個元素的名稱就是

> names(LIST)[1] 
[1] "A" 
+1

爲了清楚起見,我添加了更多上下文,但名稱(LIST)[1]不起作用。 – 2012-01-28 20:49:42

+1

明顯的解決方案,它用循環替換'lapply',你完成了......我懷疑有沒有什麼乾淨的出路,就像'lapply'一樣,你的函數不知道正在處理哪個索引。 – 2012-01-28 21:03:11

+0

我害怕循環是答案。我真的很糟糕的循環。 R是我唯一的語言,所以我失去了一個適用的解決方案,或者迷失方向。 – 2012-01-28 22:00:08