我想在不调用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(...)
的内容有什么问题?无论如何,这都不是时间上的猪。
但是我的基本回答是:您在...
条目中允许使用有效或无效的参数,从而犯了一个错误。我不知道为什么要这样设置以前的功能,但从长远来看,从更新的发行版中删除此结构可能会更清洁,更安全。帮助页面附带功能和软件包是有原因的。尽管我赞成反向兼容,但我认为您在这里没有任何帮助。此外,我不清楚您如何或为什么希望通过...
传递必需的参数。而且,如果不是必需的,那么您就不想首先模仿missing
。
您的用户会很快:-)意识到他们使用了无效的参数名称。无论您是否提供这组过渡的警告消息,它们都将适应或从您的代码迁移到其他选项。
关于r - 函数内部的missing()的替代方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27525822/