如何从 R 中的函数 return 迭代更新数据框?
How to return iteratively updated data frame from function in R?
假设我想在 while 循环内执行迭代计算并维护 运行 记录,然后 return 数据集如下(使用适当的范围):
df <- data.frame(iter=integer(), x=integer())
x = 0
df_func <- function(df, x, num_iter){
i = 0
while(i < num_iter){
i = i + 1
x = x + 10
new_df = data.frame(iter=i, x=x)
df <<- rbind(df, new_df)
}
return(df)
}
df_func(df, x, 10)
我希望 df
包含 x=1 到 10 值的十行,但我只得到最后一行:
> df
iter x
1 10 100
我错过了什么?
对 MrFlick 的评论进行一些扩展:
这里的问题是 R 中的函数执行按值传递:df
inside df_func
是 df
的副本(具有空列 iter
和 x
的 data.frame
)传递给函数。由于 <<-
的使用,此副本从未被修改。相反,在 while
的每次迭代中
df <<- rbind(df, new_df)
,
相当于
df <<- rbind(data.frame(iter=integer(), x=integer()), new_df)
,
在全局环境中修改df
,导致
> df
iter x
1 10 100
10 次迭代后。
假设我想在 while 循环内执行迭代计算并维护 运行 记录,然后 return 数据集如下(使用适当的范围):
df <- data.frame(iter=integer(), x=integer())
x = 0
df_func <- function(df, x, num_iter){
i = 0
while(i < num_iter){
i = i + 1
x = x + 10
new_df = data.frame(iter=i, x=x)
df <<- rbind(df, new_df)
}
return(df)
}
df_func(df, x, 10)
我希望 df
包含 x=1 到 10 值的十行,但我只得到最后一行:
> df
iter x
1 10 100
我错过了什么?
对 MrFlick 的评论进行一些扩展:
这里的问题是 R 中的函数执行按值传递:df
inside df_func
是 df
的副本(具有空列 iter
和 x
的 data.frame
)传递给函数。由于 <<-
的使用,此副本从未被修改。相反,在 while
df <<- rbind(df, new_df)
,
相当于
df <<- rbind(data.frame(iter=integer(), x=integer()), new_df)
,
在全局环境中修改df
,导致
> df
iter x
1 10 100
10 次迭代后。