这个站点有很多关于如何修复"未定义的列"错误的问题.
我有一个完全相反的问题:如何犯"未定义的列"错误.
我经常改变文件中的变量名.
这会导致以下错误:
r$> df <- data.frame(gender=c(1,1,NA,0))
r$> sum(is.na(df$male))
[1] 0
当正确的结果为1时.
如果我试图访问的列未定义,我希望R打印一条错误消息.
不是默默地失败.
我怎么能做到这一点?
这个站点有很多关于如何修复"未定义的列"错误的问题.
我有一个完全相反的问题:如何犯"未定义的列"错误.
我经常改变文件中的变量名.
这会导致以下错误:
r$> df <- data.frame(gender=c(1,1,NA,0))
r$> sum(is.na(df$male))
[1] 0
当正确的结果为1时.
如果我试图访问的列未定义,我希望R打印一条错误消息.
不是默默地失败.
我怎么能做到这一点?
不幸的是,在这类事情上,R过于宽大.定义了data.ages的$
运算符,以允许访问不存在的列,并在这种情况下返回NULL
.
有一些替代的data.frame实现,它们有点严格.值得注意的是,Tidyverse包'tibble','dplyr'等使用的tbl_df
数据 struct 至少会向您显示一个警告:
df <- tibble::tibble(gender = c(1, 1, NA, 0))
sum(is.na(df$male))
# [1] 0
# Warning message:
# Unknown or uninitialised column: `male`.
或者,您也可以通过覆盖data.Frames的$
来使其成为data.ages的硬错误:
registerS3method(
'$', 'tbl_df',
\(x, name) {
stopifnot(name %in% colnames(x))
NextMethod('$')
}
)
然而,请注意,这将only应用于平坦data.frame
,而不是平坦,因为后者也覆盖$
.似乎没有一个选项可以将其设置为TIBBLES的硬错误(没有将all个警告转换为错误);这可能是对包的一个很好的特性请求(或者,您可以通过将'data.frame'
替换为'tbl_df
来使上述代码应用于TIBBLES).