- 已编辑
感谢COS8卦微信群内“颜林林”@yanlinlin82 的指点:在循环体内采用全局赋值符<<-
替代=
即可。
感谢COS8卦微信群内“颜林林”@yanlinlin82 的指点:在循环体内采用全局赋值符<<-
替代=
即可。
有关全局赋值符,可以参见
https://stat.ethz.ch/pipermail/r-help/2011-April/275905.html
https://stat.ethz.ch/R-manual/R-devel/library/base/html/assignOps.html
=
作为赋值号,只能在顶层表达式中使用。
(不过循环体内有时候也可以用啊?)
2019-02-26 注:我所谓的“全局赋值符”应该是上层赋值符。
yihui 人们对 <<- 最常见的误解就是以为它是全局赋值符,但它并不是,它只是上层赋值符。如果一个对象在上层环境中不存在,那么接着到上上层中找,一直找到全局环境。如果全局环境中也不存在,R 会在全局环境中创建这个对象。
看了有关于上层赋值符的一些材料,有如下猜测:并不是循环体的问题,而是函数的问题。通道运算符是以运算符的形式提供了一个函数,而本贴中的例子就是在函数中赋值的:
Heterogeneity
(2*j) %>% {k[2*i, c(.+1, .+3, .+4)]=rnorm(1)}
所以在这里,赋值在函数中进行,一旦退出函数,所有的操作结果都会丢失。不论=
还是<-
都只能在当前层次的环境中进行赋值,所以解决不了这个问题。而上层赋值符<<-
可以跳到顶层环境中进行赋值,从而实现目的。
Heterogeneity 人们对 <<-
最常见的误解就是以为它是全局赋值符,但它并不是,它只是上层赋值符。如果一个对象在上层环境中不存在,那么接着到上上层中找,一直找到全局环境。如果全局环境中也不存在,R 会在全局环境中创建这个对象。
说实在的,我觉得你有点管道中毒的感觉,这里用管道实在是毫无价值,反增疑惑。本来是个非常简单的赋值操作:
k[2*i, 2*j + c(1, 3, 4)] = rnorm(1)
却被写得如此诘屈聱牙:
(2*j) %>% {k[2*i, c(.+1, .+3, .+4)] <<- rnorm(1)}
就像好好的一句主动语态的句子,硬用被动语态表达出来一样:
我今天中午吃了一碗饭。
一碗饭今天中午被我吃了。
这碗饭实在让人噎得慌。一个普通 R 用户看见你的一行代码至少得问四个问题:
%>%
是什么?.
是什么意思?<<-
是什么操作?每个问题都不容易回答,涉及到深层技术细节。
另:你加入论坛晚,不知道大名鼎鼎的颜大站长 @yanlinlin82 很正常,早年间很活跃,是 COS 的大功臣,可惜现在跟众人一样误入微信歧途了,只在微信上回答问题。
yihui
(1) 谢谢你告诉我<<-
的正确名称,我把这篇帖子相关的地方都改一下吧。
(2)看了《管道中毒》,五味杂陈……可能是因为R语言的开放吧,所以想把一件事情弄明白反而无比繁琐,成本极高……你指出的四个问题,除了第一个,都是我各处搜或者找人问得到的答案,限于场合或者面子学到的也是一知半解。这么学来的东西不可能以最简洁优雅的方式呈现,只能是补丁摞补丁。
(3)所以在这里冒天下之大不韪,我在很长一段时间内都是喜欢Matlab完胜过R的,至少人家的帮助文档风格整齐划一,文风清晰好懂。反观R的帮助文档,都是捏着鼻子看。
(4)大神你给出的方案确实漂亮。服。
(5)谢谢提点,我觉得还是要感谢一下颜大站长。
Heterogeneity 欢迎冒天下之大不韪,有话直说,我就喜欢这样的人。程序语言不是宗教。
管道操作必须与纯函数,向量式编程三者联合起来实现数据流编程,才是正确的使用姿势,只需很简单的几个基本组件就可以了,很简单,
另外,管道是正向前进的顺序结构.
可以参考一下我的博客PurefunctionPipelineDataflow
lincpa 广告贴我没意见。但是只卖弄不指教,故弄玄虚就差点意思了。
他那博客我看了,通篇比喻来比喻去然而言之无物,拿一堆自造的"看上去很专业"的专有名词堆砌而成。
通篇就这种感觉:
FP和OO过度复杂了,在大工业上是行不通的,还是属于手工作坊那种强调个人技术的生产方式, 个人技术极大影响了产品质量,极不可靠的生产方式。FP和OO其实全是在走弯路, 花拳秀腿,花样作死。
大概率是个民科。不过计算机的民科我还是第一次见…
搜了一下,这么想的人看来不止我一个:
拿这篇小文章到处贴来贴去不过反应寥寥
https://news.ycombinator.com/item?id=18844310
https://news.ycombinator.com/item?id=18967811
https://news.ycombinator.com/item?id=18967837
还在wikipedia里加了个链接,这应该算是原创研究吧,wiki不欢迎的那种
tctcab 你剥下了皇帝的新装……
@tctcab
至少我用这种方法构造了一个几万行的项目.
构造了从clojure到R语言基于语法树的DSL,
是来自实践的总结, 我博文里讲得很清楚了,
也有范例代码, 如果有问题可以具体提出,
我会回答的,泛泛地提问我不知从何说起.
另外,想象力很重要.搞分析的人思维不要太江化:-)
以前在Clojure群,有人说我神棍, 据我发现, 都是
初级人员.
真功夫很简单, 小文章就够了, 搞套路, 花拳秀腿
是玩杂耍的
原来wiki不喜欢原创, 原创不受欢迎是第一回听说.
Heterogeneity
我这几天在编写markdown文学编程的notepad++
pythonscript脚本,沉浸在各种选型组合和写代码,
不能自拔,我有四个专业要学习讨论, 一个
业余项目, 还有工作, 我很忙, 这个论坛我是好几天
来看一下的.
@Cloud2016 是太云吗? 太云以前帮过我,是我尊敬的
专业人士, 对于帮助过我的人我都记在个人项目的感谢榜上,
不敢怠慢.
我认为R语言向量式编程就够了,这也是数据流编程.
统计本是以数据为中心, 用数据流处理最是合适,
我对R语言OO派更流行不可理解, 倒是Clojure语言上数据流更流行,
R操纵数据的库五花八门,就象玩套路一样, 不可思议, 基本上在Clojure
上我只用核心函数中的几十个集合函数.对于数据操纵,我更倾向于
使用核心函数千锤百炼地运用, 这对提高数据建模能力很有帮助,
喜欢五花八门库的人,倾向让数据模型适应这些库, 然后模型是很烂的.
比如, ggplot2很成熟,有很多扩展, 我选用它做可视化, 但它的OO式理念
我个人不是很赞同, 我更喜欢vega-lite这种数据驱动的可视化库.
纯函数只有输入输出, 就象是自来水管, 通道运算符就象是转接头,
连接纯函数,这是基本式, 对于序列类型数据, 用map, reduce, apply,
filter等高阶函数进行处理, 避免循环状态,数据,处理逻辑混杂在一起,
即不清晰, 打断了数据流, 也难以并行处理.我的项目几万行没有任何
显式循环代码段, 尾递归也只有一个.
对我来说,整个R系统就是一个类似RMDB的数据分析服务器,R语言我是以clojure数据表示的DSL,当成数据来操纵组合,使用时,和clojure数据一起组合变换,只使用分析函数和可视化函数,很难看出是R语言了:-)
lincpa 不是!我沾了太云的光了,此处真想把太云 Call 出来,你的粉丝来了!
OO 这套东西确实用在复杂的系统上, R 里面一切皆对象,R 继承自 S 语言,扒扒它的历史就会知道,它几乎就是为 处理数据而生 Rick Becker 在 UseR2016 的演讲 --- forty years of S 设计 S 和 R 系统就使用了的 OO 的,只不过用户用起来不需要动不动就写类什么的,这应该归功于封装还是什么?(小白一枚,楼上各位大神赐教啊)
R 操作数据的包确实有很多,从数据导入导出,数据清理,数据变形,数据建模,数据可视化,数据报告,每一环都会有很多,但是对这个环境熟悉久了就会发现,好用的就是常用的那几个, tidyverse 确有优势,但我是基础函数党,能用基础函数操作数据的就用基础函数,因为它稳定,又不需要另外装包。
看到纯函数,我还以为复分析里的,吓一跳
真是迷之自信,你说的几万行的项目是完胜波音公司人工智能专家系统项目组产品 的林鹏程财务分析软件吗,好棒棒哦
另外维基那个搞清楚,不是不喜欢原创,而是不喜欢原创研究
Wikipedia articles must not contain original research.
呃,上面那篇新浪博客里为啥要向我和 @cloud_wei 致谢,我好像并没有听说过那项目……