我遇到了一个意外的问题,试图在.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下运行编织机会产生以下错误:
> 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=块选项必须将当前工作目录重置为包含子文件的工作目录,因此下面的确实使用来包含我的R文件:
<<hv-setup, include=FALSE >>=
source("../examples/odds.R")
@我想知道这是一个bug还是一个“特性”?在LaTeX中,包含文件的路径总是相对于文档根目录来考虑的,例如,
\includegraphics{fig/myfig}将在文档文件结构中的任何位置工作。
发布于 2015-08-14 14:45:53
无论您认为它是一个bug还是一个特性,都取决于您自己,但是这种行为在?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进行计算。
https://stackoverflow.com/questions/31943926
复制相似问题