访问函数中的全局变量

D. *_*der 1 r function global-variables

我有两个data.frames df1errors和功能add_to_errors()。该函数的参数是行数(of df1)的向量,该函数应将选择的行添加到名为的新data.frame中errors

df1 <- data.frame(id=1:10,
                  var1=rep(NA, 2),
                  var2=rep(NA, 2))

errors <- data.frame()

add_to_errors <- function(ids){
    rows_to_add <- df1[ids,]
    errors <- rbind(errors, rows_to_add)
    return(errors)
} 

add_to_errors(c(1,2))
add_to_errors(c(6,7))
Run Code Online (Sandbox Code Playgroud)

当我执行add_to_errors(1, 2)和时add_to_errors(6,7)errors每次调用该函数似乎都被覆盖了。如何errors在函数中作为全局变量访问?

输出应如下所示:

  id var1 var2
1  1   NA   NA
2  2   NA   NA
3  6   NA   NA
4  7   NA   NA 
Run Code Online (Sandbox Code Playgroud)

Tim*_*sen 5

我建议不要使用父作用域运算符<<-,而应使用具有适当设计和封装的函数:

add_to_errors <- function(df1, ids, errors) {
    rows_to_add <- df1[ids,]
    errors <- rbind(errors, rows_to_add)
    return(errors)
}

df1 <- data.frame(id=1:10, var1=rep(NA, 2), var2=rep(NA, 2))
errors <- data.frame()
errors <- add_to_errors(df1, c(1,2), errors)
errors <- add_to_errors(df1, c(6,7), errors)
errors

  id var1 var2
1  1   NA   NA
2  2   NA   NA
6  6   NA   NA
7  7   NA   NA
Run Code Online (Sandbox Code Playgroud)

上面的函数已经过重构,可以接受所有需要的参数作为输入,而输出是使用逻辑生成的数据帧。调用它时,我们用返回值破坏(覆盖)输入数据帧。

  • 我本来建议这个,但是你到了那里!肯定这是要走的路。应避免副作用。 (3认同)
  • @LyzandeR作为一次性脚本,您的答案是完全可以的。但是当构建更大的代码时,`&lt;&lt;-`可能会变得难以控制`:P`。 (2认同)