作者Wush978 (拒看低质媒体)
看板R_Language
标题Re: [问题] 生成随机数据矩阵
时间Fri Apr 12 08:29:24 2013
你们在讨论的两个operator: <- 和 = 已经把两种功能混淆了。
一个是replacement function, 另一个是argument passing
当直接在R的console使用如:
a <- 1
a = 1
这个是一种replacement function
他除了会把1存到a 之外,还会回传1
只是这种回传是把回传值隐藏的
你可以试试看跑:
(a <- 1)
(a = 1)
他会把隐藏的值显示出来
你也可以自己写回传隐藏值的函数:
f1 <- function() 1
f2 <- function() invisible(1) # 隐藏回传值
f1()
f2()
而当你在参数使用 <- 和 = ,又完全不同了
R 传递参数的时候,会依序比对:
1. full name
2. partial name
3. 位置
例如:
f <- function(a, b, c) {
print(a)
print(b)
print(c)
}
f(b=1,2,3) # a = 2, b = 1, c = 3
f(b<-1, 2, 3) # a = 1, b = 2, c = 3
= 在这里已经不再是replacement function,而是用於指定参数名称
<- 则还是replacement function, 所以R在解析f(b<-1, 2, 3)时
会先执行replacement function: b <- 1
由於函数回传值是1, 所以执行後就变成f(1, 2, 3)
R 再用位置来传递参数,所以a=1, b=2, c=3
你可以多尝试几次。
另外想要更详细的解释,可以参考:
- Taiwan R User Group 聚会的R-advanced的影片
- hadley的R advanced电子书:
http://github.com/hadley/devtools/wiki
(希望没背错 XD)
※ 引述《goddirk (dirk)》之铭言:
: ※ 引述《zhuangz (zhuangz)》之铭言:
: : 例如以下指令,
: : 无法以
: : 取代.
: : 其效果等同下列三项指令
: 所以是参数要在指令里面宣告用<-,外部宣告用=?
: 还是说整个程式里面=出现的时候都用<-来取代就可以了?
: 还是说有一定要用=的地方吗?
: 刚刚跑了一下你上面讲的部分.....看来我之前在run的时候有错是错这个东西了
--
欢迎加入 Taiwan R User Group :
http://www.facebook.com/Tw.R.User
我们每周一都有在「政大公企中心(台北市金华街187号)西楼WB05」
举办Machine Learning / Data Mining Monday:
报名
http://www.meetup.com/Taiwan-R/
聚会影片
https://www.youtube.com/user/TWuseRGroup
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.176.50.18
1F:→ clickhere:不全对. 04/12 09:54
2F:→ clickhere:1. 这跟 invisible 无关. 反而更混淆. 04/12 09:55
3F:→ clickhere:2. <- 和 = 都可以是 replacement function, 但 = 需要 04/12 09:56
4F:→ clickhere:用在完整的 expression 中. help("=") 04/12 09:56
5F:→ clickhere:3. 在 function 中的参数都算 expression, 会先被 eval 04/12 09:57
6F:→ clickhere:於 function 内部的 environment 中. 故 b <- 1, 已先 04/12 09:58
7F:→ clickhere:assign 在 function 内. 之後才数参数 match by order. 04/12 09:59
8F:→ clickhere: 外 04/12 10:00
9F:推 clickhere:真不晓得是谁发明 "=" 可以用在 global assignment 的 04/12 10:03
10F:推 Chris7462:'<-' 跟 '=' 都是 replacement function 04/12 10:04
11F:→ Chris7462:但是 '=' 写在 function arg 内的话是 argument passing 04/12 10:05
12F:推 clickhere:4. 请用 assignment. replacement 指得是 help("[<-") 04/12 10:05
13F:→ Chris7462:跟 invisible 无关 04/12 10:05
14F:→ Chris7462:原来上面已经有人推了 Orz 04/12 10:06
15F:→ clickhere:这是两个不同的 function.y 04/12 10:06
16F:推 goddirk:推两个C大的解释 04/12 13:47
感谢两位C 大的指教
关於invisible的部份我的确是画蛇添足了。我原本是想强调:
assignment or replacement function 都是会有回传值的,
只是平常被invisible给遮掩住了,
所以看不到。
关於第2点,我文中的意思就是说两者在console中一般都是replacement function
第4点关於名词的部份,我没有很注意到这部份的细节,多谢提醒。
至於以下的讨论可能不适合初学者了,只是我个人对於名词,以及R底层行为的研究。
关於clickhere的第3点,我认为至少在R 2.15版本上是不正确。
范例:
f <- function(a, b, c) { print(a);print(b);print(c) }
如果照clickhere的看法,f(b<-1, b<-2, b<-3) 会显示什麽呢?
如果是透过把expression放到函数内的environment的方式,那应该是跑不出来的,因为
a, c不存在(或是会找到baseenv()[["c"]])。
但是实际上他会跑出:
[1] 1
[1] 2
[1] 3
也许我讲的也不一定对,但是至少是和执行结果相符的:
R 会依序执行: "b <- 1", "b <- 2", "b <- 3"
然後把3个执行结果的回传值(1, 2, 3)依照位置pass给f, 所以就得到上述结果
同时 b <- 3 是在.GlobalEnv上解析的,不是在函数内。
跑完之後.GlobalEnv[["b"]]会变成3
这部份的确和Hadley的R advanced 中写的不符合,有空我可能再去Rd mailing list请教
(他的看法也是expression会在函数环境内解析) (这部份是我弄错了,请看後面)
若有错误还请多多指教
谢谢
※ 编辑: Wush978 来自: 114.45.149.143 (04/12 14:17)
※ 编辑: Wush978 来自: 114.45.149.143 (04/12 14:20)
再度更正一下最後一段,我记反Hadley的讲法了,所以应该真的是clickhere弄错了
R passing argument 的时候,expression的执行环境是这样子决定的:
函数的预设值,会在函数的环境内执行。
外界pass给函数的expression,会在外界的环境执行。
Example:
f <- function(a = ls())
f()
f(ls())
结果不同喔
PS. 由於不想扯到lazy evaluation,
所以我在执行expression的时间点并没有讲正确。
有兴趣的我们可以继续讨论
※ 编辑: Wush978 来自: 114.45.149.143 (04/12 14:28)
※ 编辑: Wush978 来自: 114.45.149.143 (04/12 14:30)
※ 编辑: Wush978 来自: 114.45.149.143 (04/12 14:36)
17F:推 EXILESPACER:精采! 04/12 21:58
18F:推 laba1014:这串好赞 04/14 12:37