什么是使用源与parsing和评估的警告?
简洁版本
我可以更换吗?
source(filename, local = TRUE, encoding = 'UTF-8')
同
eval(parse(filename, encoding = 'UTF-8'))
没有任何破坏的风险,使UTF-8的源文件在Windows上工作?
长版
我目前正在通过加载特定的源文件
source(filename, local = TRUE, encoding = 'UTF-8')
但是,众所周知, 这不适用于Windows ,完全停止。
作为一种解决方法, Joe Chengbuild议使用
eval(parse(filename, encoding = 'UTF-8'))
这似乎工作得很好1,但即使查阅了源代码的source
,我也不明白它们在一个关键的细节上有何不同:
source
和sys.source
都不会简单地parse
然后eval
文件内容。 相反,他们parsing文件内容,然后手动迭代parsing的expression式,并逐一eval
它们。 我不明白为什么这将是必要的sys.source
( source
至less使用它来显示详细的诊断,如果这样指示;但sys.source
做什么都没有 ):
for (i in seq_along(exprs)) eval(exprs[i], envir)
eval
报告的目的是什么? 为什么它会直接在子expression式上遍历索引呢? 还有什么其他的警告?
澄清:我不关心source
和parse
的附加参数,其中一些可以通过选项设置。
1 source
被编码绊住但parse
原因并不归结为source
尝试转换input文本的事实。 parse
没有这样的事情,它按原样读取文件的字节内容,只是在内存中将其Encoding
标记为UTF-8
。
这不是一个完整的答案,因为它主要解决问题的seq_along
部分,但太长以至于不能包含评论。
seq_along
之间的一个关键的区别是[
vs只是for i in x
方法(我相信是类似于seq_along
后面是[[
而不是[
)是前者保留expression式。 这里是一个例子来说明不同之处:
> txt <- "x <- 1 + 1 + # abnormal expression + 2 * + 3 + " > x <- parse(text=txt, keep.source=TRUE) > > for(i in x) print(i) x <- 1 + 1 2 * 3 > for(i in seq_along(x)) print(x[i]) expression(x <- 1 + 1) expression(2 * 3)
或者:
> attributes(x[[2]]) NULL > attributes(x[2]) $srcref $srcref[[1]] 2 * 3
当与eval(parse(..., keep.source=T))
进行比较时,这是否有任何实际的影响,我只能说它可以,但是不能想象它的情况。
请注意,子expression式分开也导致srcref
业务获取子集,这可能是有用的(…也许?)。