R错误间接调用参数

时间:2016-09-07 11:21:06

标签: r functional-programming

这是发生'['错误时的一个示例:

> 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/

1 个答案:

答案 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。然后,不会发生替换。我确信这是有充分理由的 - 对我来说仍然有点令人惊讶。