【发布时间】:2018-06-06 18:32:22
【问题描述】:
我正在构建一个与 git 存储库接口并与 R 函数的历史版本一起使用的包。问题是有时,这些旧函数期望输入 data.frame 有它没有的列。这些列不影响功能,但它们曾经在数据中,并且在这些旧函数中被硬编码。所以当然,我得到一个“未定义的列选择”错误。
我想使用 tryCatch 查看缺少哪些列并将它们作为虚拟对象添加到我的 data.frame 中。例如,
old_fn <- function(x) {
print(x[, "c"])
return(x)
}
df <- data.frame(a = c(1,2,3), b = c(3,4,5))
result <- 0
while(result == 0) {
result <- tryCatch(
old_fn(df),
error = function(cond) {
if (grepl("undefined columns selected", cond, fixed = T)) {
missing_cols <- # ????
for (col in missing_cols) {
df[[eval(col)]] <- NA
}
return(0)
} else {
return(1)
}
}
)
}
我尝试过调用traceback() 并从那里获取missing_cols,但这在运行时似乎并没有像我期望的那样工作。有没有办法查看哪些列未定义?
【问题讨论】:
-
你的预期输出是什么?
-
嗯,从上面的代码中,我希望看到
NA打印到控制台,因为这就是old_fn的成功运行。当然,这是一个人为的例子。查看修改 -
我能想到的任何可以解析错误消息的解决方案都非常脆弱(比您正在与之交互的旧功能更脆弱)
-
啊,所以您认为在我找到这些列时对我自己进行硬编码可能更明智?喜欢,
for (col in c("whatever", "old", "columns")) { if (! col %in% colnames(fn_data)) { fn_data[[eval)col)]] <- NA }}