R-在同一数据集上使用函数n次
在同一数据集上重复应用函数并给出最终结果而不使用for循环的最有效方法是什么?e、 gR-在同一数据集上使用函数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
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
多核工具;与嵌套或匿名函数相比,情况就不那么糟了。