任何人都可以解释导致代码最后一行错误的原因吗?这是一个错误吗?
> 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 "-"
>
答案 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
a
和b
始终会在ee
中找到,因为这是第一个遇到的作用域环境,但可以在通常的位置查找这些函数,就好像在命令行。如果您在函数调用中执行此操作,则需要分配正确的环境。
答案 1 :(得分:5)
从您创建的环境中看不到-
功能。
如果你在那里分配,
ee$`-` <- `-`
那么你的例子就可以了。