2010-08-23 102 views
12

说我具有R名单如下:l_ply:如何将列表的名称属性传递给函数?

> summary(data.list) 
           Length Class  Mode 
aug9104AP      18  data.frame list 
Aug17-10_acon_7pt_dil_series_01 18  data.frame list 
Aug17-10_Picro_7pt_dil_series_01 18  data.frame list 
Aug17-10_PTZ_7pt_dil_series_01 18  data.frame list 
Aug17-10_Verat_7pt_dil_series_01 18  data.frame list 

我要处理使用l_ply列表中的每个data.frame,但我也需要文件名(如aug9104AP)被一起传递到处理功能与data.frame。例如:

l_ply(data.list,function(df,...) { 

    cli.name<- arg_to_access_current_list_item_name 

    #make plots with df, use cli.name in plot titles 
    #save results in a file called cli.name 

    }, arg_to_access_current_list_item_name 
) 

arg_to_access_current_list_item_name应该是什么?

回答

3

如果你通过他们一个接一个,你可以使用deparse(替代(ARG)),例如:

test <- function(x){ 
     y <- deparse(substitute(x)) 
     print(y) 
     print(x) 
} 

var <- c("one","two","three") 
test(var) 
[1] "var" 
[1] "one" "two" "three" 

为l_ply,你将不得不求助于属性添加到列表本身例如:

for(i in 1:length(data.list)){ 
    attr(data.list[[i]],"name") <- names(data.list)[i] 
} 

然后你可以使用ATTR:

cli <- attr(x,"name") 

干杯

3

Joris答案是最干净的方法。我想补充一个函数来提取属性:

for(ename in names(data.list)) { 
    attr(data.list[[ename]], "ename") <- ename 
} 
ename <- function(x) attr(x, "ename") # states for element name 

所以你使用它作为:

l_ply(data.list, function(df, ...) { 
    cli.name<- ename(df) 
    # make plots, save results using cli.name 
}) 

我通常使用这种方法:

l_ply(names(data.list), function(cli.name, df=data.list[[cli.name]], ...) { 
    # make plots, save results using cli.name 
}) 

遍历名称,并从原来的提取data.frame使用它们的列表。


只是为了通知有一个破解。我不推荐它造成与帧混乱,并且很难控制。
使用事实llply实际上是一个for循环,您可以从函数内部提取实际的步骤。它可以使用get在正确的环境下完成。

l_ply(data.list, function(df, ...) { 
    cli.name<- names(data.list)[get("i",parent.frame())] 
    # make plots, save results using cli.name 
}) 
11

这是最容易的名字开始,然后用它们来提取你感兴趣的位:

l_ply(names(data.list),function(name,...) { 
    df <- data.list[[name]] 
) 

您还可以使用m_ply在名称和数据都传递:

m_ply(cbind(names(data.list), data.list), function(name, df, ...) { 
    ... 
} 
+0

我真的结束了你的第一个方法。我开始意识到,关于R的难点在于有很多方法可以做事。 – dnagirl 2010-08-25 02:54:11

+1

也许这是一个合理的功能添加?例如,给l * ply的函数可以选择采用第二个参数,否则llply可以在每个项目传入时为其隐式添加一个名称属性(也许后者的想法会涉及性能问题)。 – 2012-06-28 18:54:27

相关问题