我遇到了一个意外的问题,试图在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}
将在文档文件结构中的任何位置工作。
答案 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
。