1

运行此代码时:

library(TeachingDemos)

etxtStart(dir=getwd(), file="Nofunciona.txt")
etxtComment('Just a test')

for(i in 1:10){
  cat("###",i,":\n")  
  my.sample = sample(100)
  print(summary(my.sample))
  qqnorm(my.sample)
  etxtPlot(width=7.5)
} 

etxtStop()

我只得到一个名为“Nofunciona.txt”的文件,其中有一个文本行“只是一个测试”和包含图表的命令,但没有关于 cat() 或 print(summary()) 的结果,尽管我可以看到控制台上的结果。

如果我使用这两个循环更改循环:

for(i in 1:10){
  cat("###",i,":\n")  
  my.sample = sample(100)
  print(summary(my.sample))
}

for(i in 1:10){
  qqnorm(my.sample)
  if(archivo) etxtPlot(width=7.5)
}

etxtStop()

然后我可以获得一个文件,其中包含 cat() 和 summary() 的文本结果以及最后包含图形的命令。我知道在最后一个 for 循环中,我获得了十倍相同的图表,这是不相关的。

似乎我无法在 for 循环内同时获得图形结果和文本结果。为什么第一个代码不起作用?

任何想法?

谢谢。

4

1 回答 1

1

发生这种情况的原因是因为假设您不希望etxtPlot命令显示在脚本或命令历史记录中,因此当调用该函数时,它会设置一个变量来告诉主力内部函数(由任务调用manager) 暂时跳过输出命令和结果。这在循环之外可以正常工作,因为输出的抑制只持续到调用etxtPlot并且其他所有内容都正确输出。当您在循环中执行此操作时,问题就出现了,循环中完成的所有操作都在一个步骤中处理(?addTaskCallback有关如何处理事情的详细信息,请参阅),因此抑制命令和输出etxtPlot最终也会抑制命令和循环中其他所有内容的输出。

一种可能的解决方法是运行以下命令:

trace(etxtPlot, edit=TRUE)

然后将代码的倒数第二行中的 toTRUE更改为。FALSE现在你会看到所有的命令和输出(包括etxtPlot对)。

您可以考虑使用 knitr 包作为替代方案,特别是stitchorspin函数,如果您不想创建完整的模板文件,而只是处理一些代码。他们不做实时转录,但更好地处理自动绘图插入。

于 2013-07-22T15:25:08.090 回答