【发布时间】:2014-08-18 17:24:19
【问题描述】:
短版
我可以换吗
source(filename, local = TRUE, encoding = 'UTF-8')
与
eval(parse(filename, encoding = 'UTF-8'))
在没有任何损坏风险的情况下,让 UTF-8 源文件在 Windows 上工作?
加长版
我目前正在通过
加载特定的源文件source(filename, local = TRUE, encoding = 'UTF-8')
但是,众所周知,this does not work on Windows,句号。
作为一种解决方法,Joe Cheng suggested 改为使用
eval(parse(filename, encoding = 'UTF-8'))
这似乎工作得很好1 但是即使在查阅了source 的源代码之后,我还是不明白它们在一个关键细节上有什么不同:
source 和 sys.source 都不只是简单地parse 然后eval 文件内容。相反,它们解析文件内容,然后手动迭代解析的表达式,然后eval 将它们一一进行。我不明白为什么在sys.source 中需要这样做(source 至少使用它来显示详细诊断,如果有指示的话;但sys.source 确实nothing of the kind):
for (i in seq_along(exprs)) eval(exprs[i], envir)
分别evaling 语句的目的是什么? 为什么它要遍历索引而不是直接遍历子表达式?还有什么其他注意事项?
澄清一下:我不关心source和parse的附加参数,其中一些可以通过选项设置。
1source 被编码绊倒,而parse 不是因为source 试图转换输入文本。 parse 不做这样的事情,它按原样读取文件的字节内容,并在内存中简单地将其Encoding 标记为UTF-8。
【问题讨论】:
-
@Spacedman 为什么这些命令还存在呢? (出于更具体的原因:因为我正在处理 alternative package system。)
-
啊。仍在研究该模块系统。仙女纳芙。
-
所以这个问题纯粹是“
eval(exprs)和for(ex in exprs)eval(ex)和for(i in seq_along(exprs))eval(exprs[i])之间有什么区别?”? (在这里和那里给或接受envir)它有点乱。我的意思是,所有 UTF 的东西都是无关紧要的,你真正的问题出现在一半。 -
所以只是为了澄清一点:Joe Cheng 的
eval(parse(...))解决方法到目前为止工作得很好,但您想知道是否存在任何可能在某些时候咬人的后果差异, 正确的?而且你自然有点不安,因为你没有完全遵循源代码的作用(以及你在哪里遵循它,你并不总是理解它的基本原理)......你的终极(但可能太模糊-for-SO) 问题,“有人可以确认eval(parse(...))是source(...)的可靠替代品吗? -
evaluate 包作者(Yihui、Hadley 和 Barret Schloerke)可能对您的问题有一些有趣的见解。 evaluate 是 knitr 对 R 代码的逐语句评估的基础,它通过解析然后“手动”迭代解析的表达式来工作,依次评估每个表达式。如果有人知道这样做或不这样做的潜在“陷阱”,我想他们可能就是那些。