2013-05-31 92 views
2

使用基本功能,諸如此ř從返回的對象名稱的for循環

for (csv in list(acsv, bcsv, ccsv)){ 
myname(csv) 
} 

應打印:

acsv 
bcsv 
ccsv 

(而不是CSV)。

應當指出的是,acsv,BCSV和ccsvs都dataframes從CSV中讀取即

acsv = read.csv("a.csv") 
bcsv = read.csv("b.csv") 
ccsv = read.csv("c.csv") 

編輯: 最後我用一點妥協。其主要目的不是簡單地打印框架名稱 - 這是一個問題,因爲它是做其他事情的先決條件。

我需要在四個相同格式的文件上運行相同的功能。然後我使用了這個語法:

for(i in 1:length(csvs)){ 
    cat(names(csvs[i]), "\n") 
    print(nrow(csvs[[i]])) 
    print(nrow(csvs[[i]][1])) 
} 

然後利用嵌套列表的索引,例如,

print(nrow(csvs[[i]])) 

它顯示每個數據幀的行數。

打印(nrow(CSV的[[I]] [1]))

然後提供一個表中的每個數據幀的第一列。

我包括這個,因爲它是問題的動力。我需要能夠爲正在檢查的每個數據幀標記數據。

回答

1

我不知道你的數據是什麼樣子,所以這裏的東西組成:

csvs <- list(acsv=data.frame(x=1), bcsv=data.frame(x=2), ccsv=data.frame(x=3)) 
for(i in 1:length(csvs)) 
    cat(names(csvs[i]), "\n") 
+0

它在我使用提供的示例時有效。但是,使用csvs中的讀取,它不會。它會返回NULL。 – Donnied

+1

我打算更新這個,假設你有一個數據框的列表。如果情況並非如此,請更新您的問題並提供更多詳細信息。 – Thomas

+0

我檢查了對象的類型,它們是列表,類是data.frames。 – Donnied

2

list您已經構建了不會「記住」它構建的表達了。但是你可以使用自定義構造函數:

named.list <- function(...) { 
    l <- list(...) 
    exprs <- lapply(substitute(list(...))[-1], deparse) 
    names(l) <- exprs 
    l 
} 

所以:

> named.list(1+2,sin(5),sqrt(3)) 
$`1 + 2` 
[1] 3 

$`sin(5)` 
[1] -0.9589243 

$`sqrt(3)` 
[1] 1.732051 

使用此列表作爲參數傳遞給names,托馬斯suggested

> names(mylist(1+2,sin(5),sqrt(3))) 
[1] "1 + 2" "sin(5)" "sqrt(3)" 

要了解這裏發生了什麼,讓我們來分析一下:

> as.list(substitute(list(1+2,sqrt(5)))) 
[[1]] 
list 

[[2]] 
1 + 2 

[[3]] 
sqrt(5) 

[-1]索引留下第一個元素,所有其餘元素傳遞到deparse,這是因爲...

> lapply(as.list(substitute(list(1+2,sqrt(5))))[-1], class) 
[[1]] 
[1] "call" 

[[2]] 
[1] "call" 

請注意,你不能「重構」內substitute()通話list(...)使用簡單l。你明白爲什麼?

我也想知道這樣的功能是否已經在其中一個無數的R軟件包中可用。我發現威廉鄧拉普的this post有效地提出了相同的方法。

+0

'Hmisc'中的llist'就是你要找的 – eddi

+0

@eddi:謝謝。llist(1+ 2,sin(5),sqrt(3))'與我的函數略有不同,我不明白爲什麼。 – krlmlr

+0

這將打印所列數據幀中的所有數據。 – Donnied