r语言 - 访问函数内的全局变量



我有两个数据帧df1errors以及一个函数add_to_errors()。该函数的参数是行号(df1(的向量,该函数应将所选行添加到名为errors的新data.frame。

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))

当我执行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 

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

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

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

一种方法是使用 <<- ,像这样:

add_to_errors <- function(ids){
  rows_to_add <- df1[ids,]
  errors <<- rbind(errors, rows_to_add)
  return(errors)
} 
add_to_errors(c(1,2))
#  id var1 var2
#1  1   NA   NA
#2  2   NA   NA
add_to_errors(c(6,7))
#  id var1 var2
#1  1   NA   NA
#2  2   NA   NA
#6  6   NA   NA
#7  7   NA   NA

通过函数内的<<-更改全局环境不被认为是好的做法(这称为副作用,如果可能的话,最好避免,因为它会产生错误(。

相关内容

  • 没有找到相关文章

最新更新