r - 函数内的 Missing() 替代方案

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

最佳答案

天哪,我们真的必须为您指出合适的fortune吗?条目涉及 eval(parse()) ? 无论如何,循环 dots<-list(...) 的内容有什么问题? ?无论如何,它都不是一只时间 pig 。

但我的基本回应是:您犯了一个错误,允许 ... 中存在有效或无效的参数。条目。我不知道你为什么要这样设置以前的函数,但从长远来看,从更新版本中消除这种构造可能会更干净、更安全。函数和包附带帮助页面是有原因的。尽管我非常赞成向后兼容性,但我认为您在这里并没有帮任何人忙。此外,我不清楚您如何或为何希望通过 ... 传递必需的参数。 。如果不需要,那么您就不想模拟 missing首先。

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

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

相关文章:

r - 取消列出所选列并将其合并到 R 中的数据框

r - 带值的热图(ggplot2)

R match.fun 看不到导入包的功能

r - 64 位 R 中的 "' Calloc 'could not allocate memory"

r - 分层(分类)数据到树状图

R:如何从该列表中的所有数据框中删除行?

r - 寻找 `linearKEuclid`的使用方法以及 `spatstat`的对应函数

oracle - 在 Mac OS X 上安装 ROracle - Oracle 需要什么?

r - 使用 roxygen2 包打包 .Rd 文件

r - 如何在Rstudio中切换对Roxygen的评论?