我有两个数据帧df1
和errors
以及一个函数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
通过函数内的<<-
更改全局环境不被认为是好的做法(这称为副作用,如果可能的话,最好避免,因为它会产生错误(。