我想在不调用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, "'.")
    }
  }
}

最佳答案

天哪,我们是否真的必须将您指向与fortune有关的eval(parse())条目?
无论如何,循环遍历dots<-list(...)的内容有什么问题?无论如何,这都不是时间上的猪。

但是我的基本回答是:您在...条目中允许使用有效或无效的参数,从而犯了一个错误。我不知道为什么要这样设置以前的功能,但从长远来看,从更新的发行版中删除此结构可能会更清洁,更安全。帮助页面附带功能和软件包是有原因的。尽管我赞成反向兼容,但我认为您在这里没有任何帮助。此外,我不清楚您如何或为什么希望通过...传递必需的参数。而且,如果不是必需的,那么您就不想首先模仿missing

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

关于r - 函数内部的missing()的替代方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27525822/

10-10 07:15