作者locka (locka)
看板R_Language
标题Re: [问题] grid生样本 避免for回圈
时间Wed Mar 27 23:19:58 2019
感谢 celestialgod 版主大大提点:
以前以为 *apply 家族的函数就已经是向量化(vectorized)的写法了
查了资料才发现其实底层背後还是有 for 回圈 (觉得震撼啊...)
试试看这样的写法
theta <- seq(0,1,len=100)
df <- rep(19,len=100)
n <- rep(20,len=100)
vrt <- Vectorize(rt)
x <- vrt(n=n, df=df, ncp=1/theta)
於是 x[,1] ... x[,100] 就是100个 n 等於20 然後对应各自 delta 值的 t 分配样本了
(但是不知道 df, n 的预先定义有没有意义?)
请版上各位高手再指点~ 谢谢大家
======
补充:
但还是有查到 *apply function 的好处:
1. 程式易读性
2. 会 pre-allocate 向量的记忆体空间
2. 只影响区域变数不会改变全域变数
ref:
https://www.r-bloggers.com/vectorization-in-r-why/
※ 引述《ntpuisbest (阿龙)》之铭言:
: n <- 20
: theta=seq(0,1,len=100)
: rt(n ,1/theta )
: 如题
: 我想要生100组 ,每组都是n=20的t分配样本
: 只是这100组的theta都不一样
: 我像上面那样打 只会回传20个样本
: 并不是我想要的 2000个样本 请问要如何打才能要我要的结果
: 想避免for loop
: 用loop的话 我知道怎麽做
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.160.3.67
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1553700002.A.12F.html
1F:推 VIATOR: 其实我对於易读性这点很怀疑 04/11 07:59
2F:→ VIATOR: 大部分人都能够很快 看懂 for回圈 04/11 08:00
3F:→ VIATOR: 可是对於apply语法不懂的人很难看懂apply 04/11 08:01
4F:→ locka: 看不懂apply那可以从sapply开始学(认真误) 我以前也觉得要 04/11 08:32
5F:→ locka: 指定row或column参数的apply很难看懂;相较之下sapply亲切 04/11 08:32
6F:→ locka: 多了,传进去的就是迭代进FUN的参数,跟for是一样的概念, 04/11 08:32
7F:→ locka: 还更有弹性。看得懂for就看的懂sapply(应该吧XD) 04/11 08:32
8F:推 VIATOR: *apply各种变形各有些微不同,之後可能还要用do.call,rbind 04/11 23:57
9F:→ VIATOR: 而且如果想用平行运算,可能还要改回foreach 04/11 23:59
10F:推 VIATOR: 我虽然会用*apply了,但常常怀疑*apply的好处 04/12 00:02
11F:→ VIATOR: preallocate 大概是我目前唯一觉得的好处 04/12 00:04
12F:→ VIATOR: 但懂得自己preallocate 的话,其实for回圈也没什麽不好 04/12 00:05
13F:→ celestialgod: 基本上我同意apply系列没什麽好处 这也算是R特 04/12 14:02
14F:→ celestialgod: 殊的撰写风格,大多数人称这种写法是functional pro 04/12 14:02
15F:→ celestialgod: gramming,来避免一些太复杂的程式计算,至於好处坏 04/12 14:02
16F:→ celestialgod: 处就是各有利弊,每个人看法不同 04/12 14:02
17F:推 celestialgod: 至於平行的话,parallel::parLapply也都可以做,并 04/12 14:03
18F:推 celestialgod: 不是只有foreach能用 04/12 14:03
19F:推 VIATOR: apply系列,MATLAB有类似的写法,不过不常看到人用 04/12 14:36
20F:→ VIATOR: parLapply能处理lapply,但windows就没有办法平行mcapply 04/12 14:39
21F:→ celestialgod: MATLAB的cellfun跟arrayfun 我的爱XDD 04/12 19:50
22F:→ celestialgod: 我用matlab几乎都用那个处理资料= = 04/12 19:50
23F:→ celestialgod: matlab虽然有JIT,但是preallocation还是比较快 04/12 19:51