Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
knitr vs.交互式R行为_R_Interactive_Knitr - Fatal编程技术网

knitr vs.交互式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”

我在这里转载,因为我注意到这是knitr的作者建议的获得更多帮助的方法

我对一个.Rmd文件有点困惑,我可以在交互式R会话中逐行进行,也可以使用
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"