在通过 一次分离几个包的方式工作之后,我现在想知道下面的验证代码是否有原因base::detach
,或者是否有错误?
(函数本身是detach(name, pos = 2L, unload = FALSE, character.only = FALSE,
force = FALSE)
)
if (!missing(name)) {
if (!character.only)
name <- substitute(name)
pos <- if (is.numeric(name))
name
else {
if (!is.character(name))
name <- deparse(name)
match(name, search())
}
if (is.na(pos))
stop("invalid 'name' argument")
在我看来,无论是否设置了“character.only”参数,最好is.character(name)
在冒险运行substitute()
该name
值之前进行测试。文档没有明确说明您必须设置character.only=TRUE
whenname
是一个字符串。
那么,在我开始提交错误/增强请求之前,是否有充分的理由让验证成为这种方式?
编辑:评论 mnel 的响应,这是我的测试示例。
Rgames> detlist<-c('Hmisc','survival','splines')
Rgames> library(Hmisc)
Rgames> debug(base::detach)
Rgames> base::detach(detlist[1])
# skipped the startup stuff.
Browse[2]>
debug: if (!character.only) name <- substitute(name)
Browse[2]> name
[1] "Hmisc"
Browse[2]>
debug: name <- substitute(name)
Browse[2]>
debug: pos <- if (is.numeric(name)) name else {
if (!is.character(name))
name <- deparse(name)
match(name, search())
}
Browse[2]> name
detlist[1]
Browse[2]>
debug: if (!is.character(name)) name <- deparse(name)
Browse[2]>
debug: name <- deparse(name)
Browse[2]> deparse(name)
[1] "detlist[1]"
所以你看到了问题。我的输入变量是一个有效的名称,但未能设置character.only
为TRUE
会导致不希望deparse
的情况发生,并且match(name, search())
由于明显的原因而失败。
在我看来,如果is.character
首先检查用户会更容易,尽管在 atryCatch
内处理 mnel 描述的情况。detach
两个原因:1)如果甚至不需要参数,它会更加“用户友好” character.only
,以及 2)目前的文档没有警告用户必须设置参数是一个包含字符串的对象(但不是,我相信如果它只是一个普通字符串。无论是 detach(package:Hmisc) 还是 detach("package:Hmisc") 都可以,但正如我的示例所示,不是对同一字符串的引用)。character.only==TRUE
在何时name