“有”功能行为

时间:2011-06-22 13:36:06

标签: r

任何人都可以解释导致代码最后一行错误的原因吗?这是一个错误吗?

> ll <- list(a=1, b=2)
> ee <- as.environment(ll)
> ee
<environment: 0x0000000004d35810>
> ls(ee)
[1] "a" "b"
> with(ee, a)
[1] 1
> with(ee, a - b)
Error in eval(expr, envir, enclos) : could not find function "-"
> 

2 个答案:

答案 0 :(得分:15)

这是由于R的范围。它需要找到函数"-"()。你告诉R评估你在环境ee中的表达。那里没有函数"-"(),所以进入ee的父环境,即:

> parent.env(ee)
<environment: R_EmptyEnv>

其中也没有函数"-"()。由于空环境没有父环境

> parent.env(parent.env(ee))
Error in parent.env(parent.env(ee)) : the empty environment has no parent

R放弃搜索并抛出错误。

我们可以通过将父环境附加到ee来解决问题,其中R可以找到该函数:

> parent.env(ee) <- .BaseNamespaceEnv
> with(ee, a - b)
[1] -1

但我认为将ee的父级设置为全球环境会更自然:

> parent.env(ee) <- globalenv()
> with(ee, a - b)
[1] -1

ab始终会在ee中找到,因为这是第一个遇到的作用域环境,但可以在通常的位置查找这些函数,就好像在命令行。如果您在函数调用中执行此操作,则需要分配正确的环境。

答案 1 :(得分:5)

从您创建的环境中看不到-功能。

如果你在那里分配,

ee$`-` <- `-`

那么你的例子就可以了。