R应用返回列表的循环

问题描述:

我试图在existant R脚本中用apply循环替换for循环。尽管如此,我的旧函数返回多个数据框列表,如return(list(df1,df2))。对于一些细节,通过实例介绍如下:R应用返回列表的循环

旧脚本:

MyFunction = function(input){ 
    df1=array(NA,c(0,1)) 
    df2=array(NA,c(0,1)) 
    for(i in 1:n){ 
    ... 
    df1 = rbind(df1,action1(input)) 
    df2 = rbind(df2,action2(input)) 
    } 
return(list(df1,df2)) 

新的脚本:

Object = do.call(rbind, lapply(1:n,function(i){ 
    df1 = action1(input) 
    df2 = action2(input) 
    return(list(df1,df2)) 
})) 

我获得:

 [,1] [,2] [,3] [,4] [,5] 
[1,] List,2 List,2 List,2 List,2 List,2 
[2,] List,2 List,2 List,2 List,2 List,2 
[3,] … 

我也没办法解决我的问题。任何帮助将不胜感激。

谢谢进步,

B.Gees

+0

什么是* action1()*和* action2()*?这些不是第一个函数中的数据框,而是数组,两个非常不同的数据结构。 – Parfait

+0

对不起,我的例子没有表现力。我在输入dataFrame和'action1'和'action2'中使用了'...'来对我转换的dataFrame进行两种不同的计算。我同意你关于'array'和dataFrame的区别,但是对于我来说,初始化dataFrame并通过第一个结果dataFrame的简单串联获得好的列标题是一个简单的解决方案。 –

do.call(rbind, ...)通常用于行绑定数据帧/矩阵的列表。您有一个数据框列表列表,并且您想要相应地绑定它们,您可以尝试以下模式。

Object = do.call(Map, c(f = rbind, lapply(1:n,function(i){ 
    df1 = action1(input) 
    df2 = action2(input) 
    return(list(df1,df2)) 
}))) 

do.call(Map, ...)经过lapply作为参数传递给它Map然后从相同的位置上传递的所有数据帧到rbind返回的所有列表。即所有df1将被绑定在一起,并且所有df2将被绑定在一起。

+0

我测试并运行。非常感谢Psidom。 –