这是发生'['
错误时的一个示例:
> libs=.packages(TRUE)
> library(help=libs[1])
Błąd w poleceniu 'find.package(pkgName, lib.loc, verbose = verbose)':
nie ma pakietu o nazwie ‘[’
当我直接使用参数R
而不是间接使用library(help="base")
时, x="base"; library(help=x)
的行为有所不同,为什么R
认为我询问x
包,是什么机制用过的 ?我认为解决方案在这里:http://adv-r.had.co.nz/
答案 0 :(得分:0)
查看library
的来源,您将找到以下代码
if (!character.only)
help <- as.character(substitute(help))
substitute
的帮助说明了
substitute返回(未评估的)表达式expr的解析树,替换env中绑定的任何变量
其中env
表示当前的评估环境。但是libs
绑定在.GlobalEnv
中,而不是绑定在函数library
的环境中。
您正在做的一个简单示例
x="a"
test_fun=function(x) {
as.character(substitute(x))
}
test_fun(x)
#"x"
但是,如果在函数体中定义了x
#delete previous definition of x, if necessary
#rm(list="x")
test_fun=function(x) {
x="a"
as.character(substitute(x))
}
test_fun(x)
#"a"
在substitute
通过检查解析树的每个组件进行替换,如下所示:如果它不是env中的绑定符号,则不变。如果它是一个promise对象,即函数的形式参数或使用delayedAssign()显式创建的,则promise的表达式槽替换该符号。如果它是普通变量,则其值被替换,除非env是.GlobalEnv,在这种情况下符号保持不变。
最后一部分“除非env是.GlobalEnv,在这种情况下符号保持不变”很有意思,因为
x="a"
as.character(substitute(x))
"x"
这是因为env
在这种情况下是.GlobalEnv
。然后,不会发生替换。我确信这是有充分理由的 - 对我来说仍然有点令人惊讶。