首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >源()子文档中的文件--已更改的工作目录

源()子文档中的文件--已更改的工作目录
EN

Stack Overflow用户
提问于 2015-08-11 13:59:57
回答 1查看 469关注 0票数 1

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

代码语言:javascript
复制
CARME2015.Rnw  -- main file
  /frames
  /examples
  /fig
...

主文件包含以下块:

代码语言:javascript
复制
<<odds, child="frames/odds.Rnw">>=
@

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

代码语言:javascript
复制
<<hv-setup, include=FALSE >>=
source("examples/odds.R")
@

在RStudio下运行编织机会产生以下错误:

代码语言:javascript
复制
> 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文件:

代码语言:javascript
复制
<<hv-setup, include=FALSE >>=
source("../examples/odds.R")
@

我想知道这是一个bug还是一个“特性”?在LaTeX中,包含文件的路径总是相对于文档根目录来考虑的,例如,

代码语言:javascript
复制
\includegraphics{fig/myfig}

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

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

EN

回答 1

Stack Overflow用户

发布于 2015-08-14 14:45:53

无论您认为它是一个bug还是一个特性,都取决于您自己,但是这种行为在?knit中有记录。

在默认情况下,计算R代码块时的工作目录是输入文档的目录。

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

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

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

main.Rnw

代码语言:javascript
复制
\documentclass{article}
\begin{document}

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

print(getwd())
@

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

\end{document}

sub/child.Rnw

代码语言:javascript
复制
<<>>=
print(getwd())
@

这将打印同一目录两次。如果跳过opts_knit,则将子文档的工作目录设置为sub进行计算。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31943926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档