R 函数中缺少()的替代方法
我想在不调用R 函数中缺少()的替代方法,r,R,我想在不调用missing()函数的情况下检测函数中是否缺少变量。我已经找到了两种选择,但它们看起来都很粗糙 备选案文1 似乎缺少的变量具有Environment类“name”,但直觉上使用此构造似乎是错误的: a <- function(a, b){ e <- environment() if(class(e[["b"]]) == "name") e$b <- a print(b) } 背景 我需要这个,因为我正在更改API,我想循环使用…中的所有旧参
missing()
函数的情况下检测函数中是否缺少变量。我已经找到了两种选择,但它们看起来都很粗糙
备选案文1
似乎缺少的变量具有Environment类“name”,但直觉上使用此构造似乎是错误的:
a <- function(a, b){
e <- environment()
if(class(e[["b"]]) == "name")
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中的接口更改而产生的警告
API_changesGosh,--我们真的需要为您指出有关eval(parse())
的相应fortune
条目吗?
无论如何,在dots的内容上循环有什么问题?这些内容必须在?这样做怎么样:myfun因为该函数在标记文档中使用,可能多次,我想让旧参数运行一段时间。如果没有其他原因,,我有大量的文档需要重新制作。但是rowname
仍然可以使用此代码。@G.Grothendieck我不喜欢这个解决方案,因为我在帮助中有足够的参数,据我所知,我需要从CRAN兼容性解释Rd文件中的所有旧参数。即使使用just#'@param old_arg Deprecated see new_arg
,它似乎也没有那么友好。只需在说明中说Deprecated
。谢谢您的回答。我希望有一个更柔和的过渡,同时避免在文档中有大量的旧参数。由于其他原因,我有了…
,我想我会在过渡期使用它。正如您所注意到的,当前的解决方案不是时间猪-我很好奇它class(e[[n]])==“name”
是否是识别未计算参数的环境变量的正确方法。
# 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, "'.")
}
}
}