我想在不调用missing()
函数的情况下检测函数内是否缺少变量。我找到了两种选择,但它们看起来都很粗糙。
似乎缺少的变量具有环境类"名称"但是使用这个结构似乎是直觉错误的:
a <- function(a, b){
e <- environment()
if(class(e[["b"]]) == "name")
e$b <- a
print(b)
}
我想一个可能的解决方案是使用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, "'.")
}
}
}
答案 0 :(得分:0)
天哪, - 我们是否真的必须指出fortune
关于eval(parse())
的{{1}}条目?
无论如何,循环dots<-list(...)
的内容有什么问题?无论如何,它不是时间猪。
但我的基本回答是:您通过在...
条目中允许有效或无效的参数而犯了错误。我不知道你为什么以这种方式设置你以前的功能,但从长远来看,它可能更清洁,更安全,从你的更新版本中消除这种结构。功能和包装附带帮助页面的原因。就像我赞同背部兼容性一样,我不认为你在这里做任何人。此外,我不清楚您希望通过...
传递所需参数的方式或原因。如果不需要,那么您首先不想模仿missing
。
您的用户会很快:-)意识到他们的参数名称无效。无论您是否提供此过渡性警告消息,他们都可以适应或从您的代码迁移到其他选项。