R-在同一数据集上使用函数n次

R-在同一数据集上使用函数n次,r,for-loop,recurrence,R,For Loop,Recurrence,在同一数据集上重复应用函数并给出最终结果而不使用for循环的最有效方法是什么?e、 g set.seed(123) # create arbitrary data frame mydf <- data.frame(a = rbinom(10, 5, .5), b = rbinom(10, 8, .5)) # silly function Foo <- function(df) { df <- df * (1 + rnorm(1,0, .1)) df <- df

在同一数据集上重复应用函数并给出最终结果而不使用for循环的最有效方法是什么?e、 g

set.seed(123)

# create arbitrary data frame
mydf <- data.frame(a = rbinom(10, 5, .5), b = rbinom(10, 8, .5))

# silly function
Foo <- function(df) {
  df <- df * (1 + rnorm(1,0, .1))
  df <- df + 5
  df
}

# repeat function 5 times in a row on the same data frame
for (i in c(1:5)) {
  mydf <- Foo(mydf)
  mydf
}
set.seed(123)
#创建任意数据帧

mydf由@nrussel回答;对于给定的示例,使用
Recall()。速度方面,它类似于
循环的

doFoo <- function(df, n) {

           if (n == 0) return(df)

           Recall(Foo(df), n - 1)
         }

doFoo(mydf, 5)

doFoo我不确定这是否比
for
循环更有效,但这是一个选项:
doFoo这里是另一种方法,在函数中隐藏for循环。这并不比OP示例中的for循环快,但如果需要在多个位置应用这些循环,可能会使代码更整洁。首先只需编写一个乘法函数:
multiplier=function(f,n,…){function(x,…){for(i in 1:n){x=f(x,…)}x}
。然后,它可以应用于任何函数,如乘法器(Foo,10)(mydf)
我认为你的例子太笼统了。在某些情况下,递归函数可能会受益于使用
memoise
包进行的记忆。如果您有一个非常大的数据帧或许多循环,那么可能需要调用
Rcpp
。您想要时间效率还是内存效率?(是的,我知道:都是:-)。无论如何,如果你的函数是可矢量化的,那么就用这种方式重写它。如果没有,请使用
矢量化功能执行此操作;然后运行一个时间或内存测试,看看它是否真的有帮助。“不要使用循环”meme最初的意思是“嘿,
R
中的大多数东西都是矢量化的。这样做吧。”当矢量化很难或不可能时,循环没有错;此外,您还可以使用带有for循环的
并行
foreach
多核工具;与嵌套或匿名函数相比,情况就不那么糟了。