由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - eval (expr, envir=, enclose=) 求解答
相关主题
问一到算法题how to avoid security holes for perl CGI code using checkbo (转载)
怎么把string变为一个variable的名字 ?有用 Python Suds 的大拿吗
python用全局变量能节省程序执行时间吗?perl cgi中调用C可执行程序为什么在html中不显示? (转载)
Broken Pipe in connection pooling, envirement: JBOSS+OracleHTML print an image
Can we define pure virtual function? (转载)how to catch croak? (Perl)
【请教】Linux里面Set, Env, Stty有什么区别? (转载)一道bit operator面试题
perl 文件夹搜索路径一问请问C#里面,如何对N个数组设置循环访问?
Android C/C++ native calls Java APIs (转载)请教:这个script运行后的not found 是怎么回事?
相关话题的讨论汇总
话题: eval话题: envir话题: print话题: enclos
进入Programming版参与讨论
1 (共1页)
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.
: 听起来真像个绕口令。

1 (共1页)
进入Programming版参与讨论
相关主题
请教:这个script运行后的not found 是怎么回事?Can we define pure virtual function? (转载)
这个 perl 输出的数字为什么自动加了换行?谢谢!【请教】Linux里面Set, Env, Stty有什么区别? (转载)
metaprogrammingperl 文件夹搜索路径一问
问个简单技术问题 tclAndroid C/C++ native calls Java APIs (转载)
问一到算法题how to avoid security holes for perl CGI code using checkbo (转载)
怎么把string变为一个variable的名字 ?有用 Python Suds 的大拿吗
python用全局变量能节省程序执行时间吗?perl cgi中调用C可执行程序为什么在html中不显示? (转载)
Broken Pipe in connection pooling, envirement: JBOSS+OracleHTML print an image
相关话题的讨论汇总
话题: eval话题: envir话题: print话题: enclos