knitr vs.交互式R行为
我在这里转载,因为我注意到这是knitr的作者建议的获得更多帮助的方法 我对一个.Rmd文件有点困惑,我可以在交互式R会话中逐行进行,也可以使用knitr vs.交互式R行为,r,interactive,knitr,R,Interactive,Knitr,我在这里转载,因为我注意到这是knitr的作者建议的获得更多帮助的方法 我对一个.Rmd文件有点困惑,我可以在交互式R会话中逐行进行,也可以使用R CMD BATCH,但在使用knit(“test.Rmd”)时失败。我不确定问题出在哪里,我试图尽可能缩小问题的范围。以下是示例(在test.Rmd中): 在错误发生后直接在R控制台中使用调用可以正常工作 问题与format生成ID的方式有关(在ltraj2sldf的apply调用中),就在ID 100000之前:使用交互式调用,R给出“99994”
R CMD BATCH
,但在使用knit(“test.Rmd”)
时失败。我不确定问题出在哪里,我试图尽可能缩小问题的范围。以下是示例(在test.Rmd
中):
在错误发生后直接在R控制台中使用调用可以正常工作
问题与format
生成ID的方式有关(在ltraj2sldf
的apply
调用中),就在ID 100000之前:使用交互式调用,R给出“99994”、“99995”、“99996”、“99997”、“99998”、“99999”、“100000”;使用knitr R R可给出“99994”、“99995”、“99996”、“99997”、“99998”、“99999”、“100000”以及额外的前导空格
发生这种行为有什么原因吗?为什么knitr
的行为应该与R中的直接调用不同?我必须承认,我很难使用它,因为我无法调试它(它在交互式会话中工作)
任何暗示都将不胜感激。如果有帮助的话,我可以提供.RData(文件是4.5 Mo),但我最感兴趣的是为什么会出现这种差异。我试图想出一个可自我复制的例子,但没有成功,对此我深表歉意。提前感谢您的任何贡献
在巴蒂斯特的评论之后,下面是关于IDs生成的更多细节。基本上,ID是通过
apply
调用在数据帧的每一行生成的,该调用依次使用format
如下所示:format(dfi[“ID”],scientific=FALSE)
。这里,列id
只是从1到行数的一系列(1:nrow(df)
)scientific=FALSE
只是为了确保我没有100000的1e+05这样的结果
根据对IDs生成的探索,问题仅出现在第一条消息中显示的那些消息中,即99995到99999,其中添加了前导空格。这不应该发生在这个格式
调用中,因为我没有要求在输出中输入特定数字。例如:
> format(99994:99999, scientific = FALSE)
[1] "99994" "99995" "99996" "99997" "99998" "99999"
但是,如果ID以块的形式生成,则可能会发生以下情况:
> format(99994:100000, scientific = FALSE)
[1] " 99994" " 99995" " 99996" " 99997" " 99998" " 99999" "100000"
请注意,一次处理一个相同的结果:
> for (i in 99994:100000) print(format(i, scientific = FALSE))
[1] "99994"
[1] "99995"
[1] "99996"
[1] "99997"
[1] "99998"
[1] "99999"
[1] "100000"
最后,这与ID不是一次准备一个(正如我从apply
line调用中所期望的那样)完全一样,但在这种情况下,一次准备6个,并且只有在接近1e+05时。。。当然,只有在使用knitr时,才使用交互或批处理R
以下是我的会话信息:
> sessionInfo()
R version 3.0.1 (2013-05-16)
Platform: x86_64-pc-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=fr_FR.UTF-8 LC_NUMERIC=C
[3] LC_TIME=fr_FR.UTF-8 LC_COLLATE=fr_FR.UTF-8
[5] LC_MONETARY=fr_FR.UTF-8 LC_MESSAGES=fr_FR.UTF-8
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] knitr_1.2 adehabitatLT_0.3.12 CircStats_0.2-4
[4] boot_1.3-9 MASS_7.3-27 adehabitatMA_0.3.6
[7] ade4_1.5-2 sp_1.0-11 basr_0.5.3
loaded via a namespace (and not attached):
[1] digest_0.6.3 evaluate_0.4.4 formatR_0.8 fortunes_1.5-0
[5] grid_3.0.1 lattice_0.20-15 stringr_0.6.2 tools_3.0.1
我用这些信息向您的网站添加了一条评论
format()
在digits
选项不足以显示值但也指定了scientific=FALSE
时添加额外的空白。knitr将代码块内的数字设置为4,这会导致您描述的行为:
options(digits=4)
format(99999, scientific=FALSE)
产生:
[1] " 99999"
[1] "99999"
而:
options(digits=5)
format(99999, scientific=FALSE)
产生:
[1] " 99999"
[1] "99999"
杰夫和巴蒂斯特都是对的!这是一个选项问题,与digits
参数有关。我设法想出了一个最简单的例子(例如在test.Rmd
中):
但是,使用knit
,结果却大不相同:
> library(knitr)
> knit("test.Rmd")
[...]
## [1] "99990" "99991" "99992" "99993" "99994" " 99995" " 99996"
## [8] " 99997" " 99998" " 99999" "100000" "100001" "100002" "100003"
## [15] "100004" "100005" "100006" "100007" "100008" "100009" "100010"
请注意99994之后的额外前导空格。差异实际上来自于数字
选项,正如Jeff正确建议的那样:R默认使用7,而knitr使用4。这种差异会影响格式的输出
,尽管我真的不明白这里发生了什么。R型:
> options(digits = 7)
> format(99999, scientific = FALSE)
[1] "99999"
针织风格:
> options(digits = 4)
> format(99999, scientific = FALSE)
[1] " 99999"
但它应该会影响所有数字,而不仅仅是在99994之后(老实说,我甚至不明白为什么它会添加前导空格):
从这一点上,我不知道是谁出了错:knitr
、apply
还是format
?至少,我想出了一个解决办法,在格式中使用参数trim=TRUE
。它没有解决问题的原因,但确实删除了结果中的前导空格…多亏了Aleksey Vorona和Duncan Murdoch,这个错误现在已在R-devel中修复
请参阅:long shot:knitr
可能会更改某些格式选项(例如有效位数),以某种方式影响ID的生成方式。可能是。但我仍然不知道哪些选项会影响这个输出。让我在第一条消息中添加有关ID生成的更多详细信息。。。看看这是否更有意义!谢谢。你能就这个格式问题举个简单的例子吗?我不明白apply和空格填充的含义。你的名单上有没有10000个?不可否认,我也不明白!)但是,是的,该表的行数大于100000行,因此生成的ID也高于此值。我已经试着提出了一个最小的可重复的例子,但到目前为止还没有成功(因为我不明白的原因,当我把这个例子减少太多的时候,问题就消失了)。我会再试一次,然后回到这里。在这个特定的例子中,format()
不是一个好的选择,因为结果可能会受到许多全局选项的影响;为了忠实地获得数字的字符表示形式,我建议您只需将用作.character()
,这样就不会发生任何意外。顺便说一句,我很高兴你按照我的建议来这么做。正如你所看到的,一位作者(即我)的帮助和反应远不如成千上万的专家:)完全正确!这让我尽可能地缩小了问题的范围,而选项(digits=X)
确实是问题的导火索!请看下面我的答案。嗯,我也不太明白这一点;也许它被记录在某个地方,虽然我给R-help列表发送了一条消息,让我们看看是否有人对它有更多的想法
> options(digits = 7)
> format(99999, scientific = FALSE)
[1] "99999"
> options(digits = 4)
> format(99999, scientific = FALSE)
[1] " 99999"
> options(digits = 4)
> format(c(1:10, 99990:100000), scientific = FALSE)
[1] " 1" " 2" " 3" " 4" " 5" " 6" " 7"
[8] " 8" " 9" " 10" " 99990" " 99991" " 99992" " 99993"
[15] " 99994" " 99995" " 99996" " 99997" " 99998" " 99999" "100000"