访问函数中的全局变量

时间:2019-06-21 10:02:10

标签: r function global-variables

我有两个data.frames df1errors和一个函数add_to_errors()。该函数的参数是行号(df1的向量),该函数应添加将所选行添加到新数据帧中,称为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))

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

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

一种方法是使用<<-,如下所示:

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

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