替代函数内的missing()

时间:2014-12-17 12:36:59

标签: r

我想在不调用missing()函数的情况下检测函数内是否缺少变量。我找到了两种选择,但它们看起来都很粗糙。

备选方案1

似乎缺少的变量具有环境"名称"但是使用这个结构似乎是直觉错误的:

a <- function(a, b){
  e <- environment()
  if(class(e[["b"]]) == "name")
    e$b <- a

  print(b)
}

备选方案2

我想一个可能的解决方案是使用parseeval,但它看起来和以前的解决方案一样粗糙:

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, "'.")
    }
  }
}

1 个答案:

答案 0 :(得分:0)

天哪, - 我们是否真的必须指出fortune关于eval(parse())的{​​{1}}条目? 无论如何,循环dots<-list(...)的内容有什么问题?无论如何,它不是时间猪。

但我的基本回答是:您通过在...条目中允许有效或无效的参数而犯了错误。我不知道你为什么以这种方式设置你以前的功能,但从长远来看,它可能更清洁,更安全,从你的更新版本中消除这种结构。功能和包装附带帮助页面的原因。就像我赞同背部兼容性一样,我不认为你在这里做任何人。此外,我不清楚您希望通过...传递所需参数的方式或原因。如果不需要,那么您首先不想模仿missing

您的用户会很快:-)意识到他们的参数名称无效。无论您是否提供此过渡性警告消息,他们都可以适应或从您的代码迁移到其他选项。