单独处理多个结构相同的 data.frame 是一种难以管理的方法,尤其是在迭代次数多于几次的情况下。一种流行的“最佳实践”是处理“data.frames 列表”,例如:
n <- 10 # number of times you need to repeat the process
out <- vector("list", n)
out[[1]] <- thisdata
for (i in 2:n) out[[i]] <- simplefunc(out[[i-1]])
您可以查看任何中间值
str(out[[10]])
# 'data.frame': 20 obs. of 2 variables:
# $ vara: num 1 2 3 4 5 6 7 8 9 10 ...
# $ varb: num 10 11 12 13 14 15 16 17 18 19 ...
如您所料,最终结果在out[[n]]。
这可以使用Reduce 稍微简化,并向simplefunc 添加一个可丢弃的第二个参数:
simplefunc <- function(data, ...) {
datasetfinal2 <- data %>% mutate(varb = varb+1)
return(datasetfinal2)
}
out <- Reduce(simplefunc, 1:10, init = thisdata, accumulate = TRUE)
这确实有效:
tmp <- simplefunc(thisdata, 1)
tmp <- simplefunc(tmp, 2)
tmp <- simplefunc(tmp, 3)
# ...
(事实上,如果您查看Reduce 的来源,它实际上是在执行我上面的第一个建议。)
请注意,如果simplefunc 有其他不能删除的参数,也许:
simplefunc <- function(data, ..., otherarg, anotherarg) {
datasetfinal2 <- data %>% mutate(varb = varb+1)
return(datasetfinal2)
}
尽管您必须将所有其他调用更改为 simplefunc 以“按名称”而不是按位置传递参数(这是一种常见/默认方式)。
编辑:如果您不能(或不想)编辑simplefunc,您始终可以使用匿名函数来忽略迭代器/计数器:
Reduce(function(x, ign) simplefunc(x), 1:10, init = thisdata, accumulate = TRUE)