可能是一个简单的问题。
我正在运行sapply
函数,除了函数执行的其他操作之外,我还要更新data.frame
。
我认为这个示例代码可行:
df <- NULL
res <- sapply(1:10, function(i){
if(is.null(df)){
df <- data.frame(itr=i,let = letters[i])
} else{
tmp.df <- data.frame(itr=i,let = letters[i])
df <- rbind(df,tmp.df)
}
return(i)
})
实际上,我返回的内容比索引i
更精细。这只是一个简化的例子。
但运行df
后,sapply
仍为NULL。
如何更新df
?
答案 0 :(得分:2)
正在分配的函数中定义的df
与函数外部定义的df
不同df
。如果您将df <-
的两个匹配项替换为df <<-
,那么它将起作用。
虽然效率低下(因为连续附加到R中的对象效率低下),但您可以在这样的循环中连续追加行:
df <- NULL
for(i in 1:10) df <- rbind(df, data.frame(itr = i, let = letters[i]))
最好是创建一个行列表,然后立即rbind
:
do.call("rbind", lapply(1:10, function(i) data.frame(itr = i, let = letters[i])))