2012-07-25 44 views
1

我想重复应用一个函数,该函数将两个参数应用于列表,使用第一个调用的结果以及第二个调用的第三个参数等等,以及这样。使用先前调用的结果反复重新应用2参数函数

例如如果列表有4个元素,并给定函数f,我希望结果为f(f(f(1,2),3),4)。这样的功能是否存在?

一个例子是有一个数据框的列表,它应该被全部合并在一个特定的列上。

+3

也许'Reduce'可以提供帮助。 – johannes 2012-07-25 08:01:14

+1

完美,谢谢! – Cookie 2012-07-25 08:02:40

+1

虽然 – Cookie 2012-07-25 08:07:39

回答

4

递归调用函数的一种方法是使用Reduce。从?Reduce

“减少”使用二进制函数来依次结合在给定矢量的 元件和可能的给定的初始值。

你可以从像这样的列表合并几个data.frame:

# some dummy data 
a <- list(data.frame(a=1:10, b=rnorm(10)), data.frame(a=1:10, b=rnorm(10)), data.frame(a=1:10, b=rnorm(10))) 

Reduce(function(u, v) cbind(u, v$b) , a) 
    a   b  v$b   v$b 
1 1 -1.2968741 -0.4186869 0.29888504 
2 2 -0.2680551 0.3315939 2.05348116 
3 3 -0.5188585 0.5125005 1.95103927 
4 4 -0.7447659 -1.2982199 0.80582874 
5 5 0.2391337 -0.6818633 -0.75994882 
6 6 -0.6391927 0.3584701 1.50356731 
7 7 1.0117809 -0.1060888 0.07402643 
8 8 -1.8877719 -0.4380313 0.49141877 
9 9 -0.7392668 1.1527095 1.40168828 
10 10 -1.0318087 0.1889492 1.39867700 
+0

'cbind'实际上可以很好地运行在'do.call'上,但我更想的是merge,但reduce是我想要的, – Cookie 2012-07-25 08:47:59