gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:45:51 26 4
gpt4 key购买 nike

我想检测函数内是否缺少变量,而不调用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com