楼主: dxystata
2243 14

[问答] 结果不同为什么? [推广有奖]

版主

已卖:302份资源

大师

37%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
183395 个
通用积分
15333.1475
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
298627 点
帖子
5586
精华
1
在线时间
13632 小时
注册时间
2006-6-21
最后登录
2025-12-22

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

楼主
dxystata 发表于 2013-4-15 23:07:14 |AI写论文
10论坛币
s1 <- function(x, y = substitute(x)) { x <- x + 1; y }
s2 <- function(x, y) { if(missing(y)) y <- substitute(x); x <- x + 1; y }
a <- 10
s1(a) # 11s2(a) # a谢谢!

关键词:结果不同

沙发
求证1加1 发表于 2013-4-16 08:25:04
直接在function里定义缺省值的话,他会在最后用到的时候执行,这里就是最后一句。而用if语句的话,一开始就执行了,后面就没他什么事了。回答完毕。不好意思一开始回答错了,非常抱歉
ps:stata版大改行了?
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 100 热心帮助其他会员
h3327156 + 3 + 5 + 3 观点有启发

总评分: 论坛币 + 100  学术水平 + 3  热心指数 + 5  信用等级 + 3   查看全部评分

个人主页,欢迎订阅http://chenangliu.info/

藤椅
ntsean 发表于 2013-4-16 09:37:31
这是R特有的一个性质,叫做lazy evaluation, 只有在需要的时候才evaluate他的值
所以这两个函数evaluate的时间不同
s1里面,y=substitue(x) 是最后执行y语句时候才evaluate的(虽然他是再函数定义里面,但是因为没需要所以一直没有evaluate),这个时候 x变成11了,所以y是11
s2里面,y一开始就evaluate了,这个时候x才是10,所以y是10
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
h3327156 + 3 + 5 + 3 热心帮助其他会员

总评分: 学术水平 + 3  热心指数 + 5  信用等级 + 3   查看全部评分

板凳
ntsean 发表于 2013-4-16 09:40:54
求证1加1 发表于 2013-4-16 08:25
直接在function里定义缺省值的话,在函数全局都会有效,也就是一直到函数执行完毕,y=x恒成立。而用if语句的 ...
这个解释肯定不对, 比如

s1 <- function(x, y = substitute(x)) { y; x <- x + 1; y }
s1(10) 还是 10

报纸
求证1加1 发表于 2013-4-16 10:33:09
ntsean 发表于 2013-4-16 09:40
这个解释肯定不对, 比如

s1
对对 不好意思 我刚才脑子抽风了 非常抱歉
个人主页,欢迎订阅http://chenangliu.info/

地板
dxystata 发表于 2013-4-16 11:37:30
ntsean 发表于 2013-4-16 09:37
这是R特有的一个性质,叫做lazy evaluation, 只有在需要的时候才evaluate他的值
所以这两个函数evaluate的时间不同
s1里面,y=substitue(x) 是最后执行y语句时候才evaluate的(虽然他是再函数定义里面,但是因为没需要所以一直没有evaluate),这个时候 x变成11了,所以y是11
s2里面,y一开始就evaluate了,这个时候x才是10,所以y是10
这里s1(a)的结果是11,s2(a)的结果是a

7
ntsean 发表于 2013-4-16 11:48:36
dxystata 发表于 2013-4-16 11:37
这里s1(a)的结果是11,s2(a)的结果是a
我想可能 substitute(x) 返回的object的类型是 name
所以你可以用 class(s2(a))
因为substitute 不自动evaluate 里面的参数。
如果 eval(substitute(x))那么就返回a的值了

8
h3327156 发表于 2013-4-16 12:08:12
"求证1加1" 的看法 与"ntsean" 的观点都是很有启发性,而且很热心。【他举的例子可以参考】

我个人对R不太熟,哈! 不过印象中,substitute用在字符串吗?
坦白说,我个人对于{ } 也就是statements 在阅读上有点困扰,哈! 可能是中Stata的语法毒。

s1 <- function(x, y = substitute(x)) { x <- x + 1; y }
s2 <- function(x, y) { if(missing(y)) y <- substitute(x); x <- x + 1; y }
s3 <- function(x, y) { if(missing(y)) { y <- x + 1} ;y}
s4 <- function(x, y = substitute(x)) { y; x <- x + 1; y }
s5 <- function(x, y = substitute(x)) { x <- x + 1; y }
a <- 10
s1(a)
s2(a)
s3(a)
s4(a)
s5(a)

为什么s1(a)是11,s2(a)是a,s3(a)是11,s4(a)是a,s5(a)是11
感觉我只是重复stata版主"dxystata"的问题,而且再加问几个…
不过这些差异可以帮助个人对于自建function的理解。

9
dxystata 发表于 2013-4-16 12:16:39
求证1加1 发表于 2013-4-16 08:25
直接在function里定义缺省值的话,他会在最后用到的时候执行,这里就是最后一句。而用if语句的话,一开始就执行了,后面就没他什么事了。回答完毕。不好意思一开始回答错了,非常抱歉
ps:stata版大改行了?
最近用R写点东西,需要恶补!

10
h3327156 发表于 2013-4-16 12:25:27
dxystata 发表于 2013-4-16 12:16
最近用R写点东西,需要恶补!
哈! 我也是,我是因为要用到 R 的 np package,只好恶补一阵子 R,最近在恶补 Rats,反正缺什么就补什么,不过很容易语法乱乱乱就是了!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-27 04:14