什么是使用源与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 ,我也不明白它们在一个关键的细节上有何不同:

sourcesys.source不会简单地parse然后eval文件内容。 相反,他们parsing文件内容,然后手动迭代parsing的expression式,并逐一eval它们。 我不明白为什么这将是必要的sys.sourcesource至less使用它来显示详细的诊断,如果这样指示;但sys.source做什么都没有 ):

 for (i in seq_along(exprs)) eval(exprs[i], envir) 

eval报告的目的是什么? 为什么它会直接在子expression式上遍历索引呢? 还有什么其他的警告?

澄清:我关心sourceparse的附加参数,其中一些可以通过选项设置。


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业务获取子集,这可能是有用的(…也许?)。