knitr:source()子文档中的文件---工作目录已更改

时间:2015-08-11 13:59:57

标签: r knitr children

我遇到了一个意外的问题,试图在knitr .Rnw文件的子文档中获取包含某些函数的文件。我的目录结构是

CARME2015.Rnw  -- main file
  /frames
  /examples
  /fig
...

主文件包含此块:

<<odds, child="frames/odds.Rnw">>=
@

在子文件./frames/odds.Rnw中,我有以下块:

<<hv-setup, include=FALSE >>=
source("examples/odds.R")
@

在RStudio下运行knitr会出现此错误:

> knit2pdf("CARME2015.Rnw", quiet = TRUE)
processing file: ./frames/intro.Rnw
processing file: ./frames/ucb-ex.Rnw
processing file: ./frames/odds.Rnw
Quitting from lines 2-9 (./frames/odds.Rnw) 
Quitting from lines 78-93 (./frames/odds.Rnw) 
Error in file(filename, "r", encoding = encoding) : 
  cannot open the connection

我终于意识到child= chunk选项必须将当前工作目录重置为包含子文件的目录,因此以下确实可以包含我的R文件:

<<hv-setup, include=FALSE >>=
source("../examples/odds.R")
@

我想知道这应该被视为错误还是“功能”?在LaTeX中,包含文件的路径始终被认为是相对于文档根目录的,例如,

\includegraphics{fig/myfig}

将在文档文件结构中的任何位置工作。

(相关主题:knitr: child document in different directory

1 个答案:

答案 0 :(得分:1)

您是否认为它是错误或功能取决于您,但?knit中记录了此行为:

  

评估R代码块时的工作目录是默认情况下输入文档的目录。

由于子文档只是(RNW)“文档中包含的文档”,因此子文档获得自己的工作目录是很自然的。

与LaTeX的比较无效,因为您input只有文档的片段,而不是自包含的文档。 (回想一下:子文档包含而不仅仅是一个块的内容,这就是我在这里所说的“自包含”。)

也就是说,这就是为什么你可以避免由于标准行为而可能出现的问题:在主文件中,将root.dir设置为当前工作目录。

main.Rnw

\documentclass{article}
\begin{document}

<<>>=
library(knitr)
opts_knit$set(root.dir = getwd())

print(getwd())
@

<<child = "sub/child.Rnw">>=
@

\end{document}

sub/child.Rnw

<<>>=
print(getwd())
@

这会打印两次相同的目录。如果跳过opts_knit,将评估子文档,并将工作目录设置为sub