"有"功能行为

ggg*_*ggg 6 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 "-"
> 
Run Code Online (Sandbox Code Playgroud)

Rei*_*son 15

这是由于R的范围.它需要找到这个功能"-"().你告诉R评估你在环境中的表达ee.那里没有任何功能"-"(),所以继续进行父环境ee,即:

> parent.env(ee)
<environment: R_EmptyEnv>
Run Code Online (Sandbox Code Playgroud)

哪里也没有功能"-"().由于空环境没有父环境

> parent.env(parent.env(ee))
Error in parent.env(parent.env(ee)) : the empty environment has no parent
Run Code Online (Sandbox Code Playgroud)

R放弃了搜索并抛出了一个错误.

我们可以通过将父环境附加到eeR可以找到函数的位置来解决问题:

> parent.env(ee) <- .BaseNamespaceEnv
> with(ee, a - b)
[1] -1
Run Code Online (Sandbox Code Playgroud)

但我认为将父母设定ee为全球环境会更自然:

> parent.env(ee) <- globalenv()
> with(ee, a - b)
[1] -1
Run Code Online (Sandbox Code Playgroud)

a并且b总是会在ee遇到的第一个作用域环境中找到,但是可以在通常的位置查找函数,就好像在命令行中运行它一样.如果您在函数调用中执行此操作,则需要分配正确的环境.

  • +1"with.default"的来源说明了为什么父环境很重要.并且`?as.environment`表示如果`x`是一个列表,"返回相当于`list2env(x,parent = emptyenv())`." 所以你可以在这种情况下使用`list2env`而不是`as.environment`并在那里设置父环境. (4认同)
  • 使用`globalenv()`而不是`.GlobalEnv`稍微好一些 (3认同)

Ric*_*ton 5

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

如果你在那里分配,

ee$`-` <- `-`
Run Code Online (Sandbox Code Playgroud)

那你的例子就可以了.

  • 所以出售抵押贷款,但这并没有阻止任何人.:P (6认同)
  • 那是作弊 ;-) (4认同)