我有两个data.frames df1
和errors
和一个函数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
答案 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
在函数内通过<<-
更改全局环境不被认为是一种好习惯(这被称为副作用,最好避免-如果可能的话,因为它会产生错误)。