m******r 发帖数: 1033 | 1 问题看似极其简单, 是从?eval抄录而来,略作修改。
ev <- function() {
a <- expression(x+y)
list(eval = eval(a ) )
}
tst.ev <- function(a = 7) { x <- pi; y <- 1; ev() }
tst.ev() #-> aa : 7, eval : 4.14
上面这个运行不通,如果加上第二个参数,parent.frame() 就可以了。
按照eval的定义:
Usage
eval(expr, envir = parent.frame(),
enclos = if(is.list(envir) || is.pairlist(envir))
parent.frame() else baseenv())
我不理解的地方是:如果我只指定一个参数,按照eval定义, R应该会默认如下:
eval(a, envir=parent.frame(), enclos = parent.frame())
因为我没有指定envir enclose, 按照R文档,envir 被设置为parent.frame(), enclos
根据if else, 也应该被设置成parent.frame() 也许我理解有误?
dracobe, 三民主义可以帮忙看看吗? | m****o 发帖数: 182 | 2 这种问题最好上stackoverflow去问,实在需要答案,可以两天后悬赏答案。
【在 m******r 的大作中提到】 : 问题看似极其简单, 是从?eval抄录而来,略作修改。 : ev <- function() { : a <- expression(x+y) : list(eval = eval(a ) ) : } : tst.ev <- function(a = 7) { x <- pi; y <- 1; ev() } : tst.ev() #-> aa : 7, eval : 4.14 : 上面这个运行不通,如果加上第二个参数,parent.frame() 就可以了。 : 按照eval的定义: : Usage
| m******r 发帖数: 1033 | 3 多谢。 我还是喜欢在这里问。 因为比较通俗易懂。 我不是developer, 属于自学成才
的。
【在 m****o 的大作中提到】 : 这种问题最好上stackoverflow去问,实在需要答案,可以两天后悬赏答案。
| m******r 发帖数: 1033 | 4 再问个问题,就是两个函数,f call g.
这个问题看似简单,但涉及到环境问题,所以我加了一堆print 把环境打出来. 如果g
定义在f里面,就成了所谓closure, 问题就简单了,g要什么变量,自己没有,就找f要
,f没有的,就找global ENV. 所有的环境,都是串起来的。
可现在f和g都定义在global ENV, 问题来了,g如果找不到变量,是从f要呢 还是从
global ENV要呢? f是g的calling environment, gloval ENV是g的defining
environment, 或者叫enclosing environment.
我看的几本书里面,我理解是: 这种情况下要找g的enclosing environment, 就是g的
defining environment. 也许我理解错了。 可书上也没明确说要找calling。
x <- 500
g <- function(x) {
print(x)
print('[inner]==current_environment==')
print(environment())
print('[inner]==calling_environment==')
print(parent.frame())
print('[inner]==enclosing_environment==')
print(parent.env(environment()))
}
f <- function(x ) {
print('[outer]==current_environment==')
print(environment())
print('[outer]==calling_environment==')
print(parent.frame())
print('[outer]==enclosing_environment==')
print(parent.env(environment()))
g( x )
}
f( 3.2 ) | m*****n 发帖数: 3575 | 5 R里面不守规矩的地方多了去了
你硬要它守规矩,只能是自己绕着弯受累 | m******r 发帖数: 1033 | 6 多谢回答。 我自学R一年有余, 这是我看的最后一本书的最后一个问题,以后不再琢
磨这些个不着边际的底层的东西了。
也许看书看走了眼, thomas mainlund和renkun的书 最后都反复强调enlosing
environment的重要性, 说这是r的一大特点。 就像closure。 A 造出了 A_1, 【江
湖黑话 A_1是closure, A是它的enclosing environment, 是defining environment】
。 如果在全局环境下调用A_1, A_1先要到A里面找变量, 而不是全局环境 尽管你在全
局环境下调用了A_1.
听起来真像个绕口令。
【在 m*****n 的大作中提到】 : R里面不守规矩的地方多了去了 : 你硬要它守规矩,只能是自己绕着弯受累
| m*****n 发帖数: 3575 | 7 最守规矩的是python
它告诉你1+1
你连乘除法都能即想即得
你说的这个是基本的lexical scoping法则
例如global有个x
你的函数里又定义个x
在运算时如果再调用x
肯定得找函数里这个x而不是在外面找
如果找不到才会在从里到外的一层一层的外面找
中国俗话管它叫
“县官不如现管”
【在 m******r 的大作中提到】 : 多谢回答。 我自学R一年有余, 这是我看的最后一本书的最后一个问题,以后不再琢 : 磨这些个不着边际的底层的东西了。 : 也许看书看走了眼, thomas mainlund和renkun的书 最后都反复强调enlosing : environment的重要性, 说这是r的一大特点。 就像closure。 A 造出了 A_1, 【江 : 湖黑话 A_1是closure, A是它的enclosing environment, 是defining environment】 : 。 如果在全局环境下调用A_1, A_1先要到A里面找变量, 而不是全局环境 尽管你在全 : 局环境下调用了A_1. : 听起来真像个绕口令。
|
|