我想检测函数内是否缺少变量,而不调用 missing()
函数。我找到了两种替代方案,但它们看起来都很粗糙。
替代方案 1
似乎缺少的变量具有环境类“名称”,但使用此构造似乎直观上是错误的:
a <- function(a, b){
e <- environment()
if(class(e[["b"]]) == "name")
e$b <- a
print(b)
}
替代方案 2
我猜一个可能的解决方案是使用 parse
和 eval
但它看起来和之前的解决方案一样粗糙:
a <- function(a, b){
e <- environment()
if(eval(parse(text = sprintf("missing(%s)", "b"))))
e$b <- a
print(b)
}
背景
我需要这个,因为我正在更改 API,并且我想循环 ...
中的所有旧参数名称,并发送警告,提示用户应更新到新参数名称。这就是 missing()
不起作用的原因,我当前的设置是:
# Warnings due to interface changes in 1.0
API_changes <-
c(rowname = "rnames",
headings = "header",
halign = "align.header")
dots <- list(...)
fenv <- environment()
for (i in 1:length(API_changes)){
old_name <- names(API_changes)[i]
new_name <- API_changes[i]
if (old_name %in% names(dots)){
if (class(fenv[[new_name]]) == "name"){
fenv[[new_name]] <- dots[[old_name]]
dots[[old_name]] <- NULL
warning("Deprecated: '", old_name, "'",
" argument is now '", new_name ,"'",
" as of ver. 1.0")
}else{
stop("You have set both the old parameter name: '", old_name, "'",
" and the new parameter name: '", new_name, "'.")
}
}
}
最佳答案
天哪,我们真的必须为您指出合适的fortune
吗?条目涉及 eval(parse())
?
无论如何,循环 dots<-list(...)
的内容有什么问题? ?无论如何,它都不是一只时间 pig 。
但我的基本回应是:您犯了一个错误,允许 ...
中存在有效或无效的参数。条目。我不知道你为什么要这样设置以前的函数,但从长远来看,从更新版本中消除这种构造可能会更干净、更安全。函数和包附带帮助页面是有原因的。尽管我非常赞成向后兼容性,但我认为您在这里并没有帮任何人忙。此外,我不清楚您如何或为何希望通过 ...
传递必需的参数。 。如果不需要,那么您就不想模拟 missing
首先。
您的用户很快就会:-)意识到他们的参数名称无效。无论您是否提供这组过渡性警告消息,它们都会适应或从您的代码迁移到其他选项。
关于r - 函数内的 Missing() 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27525822/