我努力学习针织品。
针织品允许您嵌套使用该语言编写的“内联代码”片段R之间\Sexpr{...}
。
针织品可以嵌套用语言编写的“代码块”R之间
<< >>=
[chunk of R-code goes here]
@
. knitr 会预处理输入文件。因此,所有内联代码片段和所有代码块都由语言处理R.
在输入到 (La)TeX 的内容中,内联代码片段和代码块被此处理的结果所替换。
我尝试写一个R-函数执行系统调用,例如,echo some phrase
捕获标准输出并传递到由创建的 .tex 文件中针织品。
现在我有一个R- 在其中执行此操作的功能R-code-chunks 和另一个在其中执行此操作的函数R- -\Sexpr
内联代码片段。
在其中使用的函数 R-code-chunks 无法正常工作R- -\Sexpr
内联代码片段。
在其中使用的函数 R- \Sexpr
-inline-code-snippets 在以下范围内不起作用R-代码块。
问题是:
应该R-功能针织品看起来像在内 R- \Sexpr
-inline-code-snippets 及其内R-代码块?
这是文件测试版我到目前为止:
<<CallExternalFunctionsStuff, include=FALSE, cache=FALSE, echo=FALSE, results='asis'>>=
knitr::opts_template$set(
CallExternalApp = list(include=TRUE, cache=FALSE, echo=FALSE, results='asis')
)
CallExternalAppInChunk <- function(A) {
return(cat(paste(system(A, intern = TRUE),collapse="\n")))
}
CallExternalAppInSexpr <- function(A) {
return(paste(capture.output(cat(system(A, intern = TRUE), sep="\n", fill=FALSE)), collapse="\n"))
}
@
\documentclass{article}
\begin{document}
\noindent Between ZZZ is what \verb|verbatim| does usually:\bigskip
ZZZZ
\begin{verbatim}
hello1
hello2
\end{verbatim}ZZZZ
\bigskip
\noindent \verb|CallExternalAppInChunk| works inside an R-code-chunk:\bigskip
ZZZZ
\begin{verbatim}
<<opts.label='CallExternalApp'>>=
CallExternalAppInChunk("echo hello1&&echo hello2")
@
\end{verbatim}ZZZZ
\bigskip
\noindent \verb|CallExternalAppInSexpr| works inside knitR's \verb|\Sexpr|:\bigskip
ZZZZ
\begin{verbatim}
\Sexpr{CallExternalAppInSexpr("echo hello1&&echo hello2")}
\end{verbatim}ZZZZ
\bigskip
\noindent \verb|CallExternalAppInSexpr| does not work inside an R-code-chunk:\bigskip
ZZZZ
\begin{verbatim}
<<opts.label='CallExternalApp'>>=
CallExternalAppInSexpr("echo hello1&&echo hello2")
@
\end{verbatim}ZZZZ
\bigskip
\noindent \verb|CallExternalAppInChunk| does not work inside knitR's \verb|\Sexpr|:\bigskip
ZZZZ
\begin{verbatim}
\Sexpr{CallExternalAppInChunk("echo hello1&&echo hello2")}
\end{verbatim}ZZZZ
\end{document}
以下是产生的输出
答案1
简短的回答是,返回字符串但用 标记xfun::raw_string()
,例如,
CallExternalApp <- function(A) {
xfun::raw_string(paste(system(A, intern = TRUE), collapse = "\n"))
}
在底层,xfun::raw_string()
将让 R 的print()
功能打印一个字符串cat()
,这使得它在代码块中工作,并且还返回字符串本身(使用新类),这使得它在内联表达式中工作\Sexpr{}
。
在代码块中,R 对象会自动打印(这是R 的一个微妙特性)。在内联 R 表达式中,针织品获取其返回值并将其写出,除非该值被标记为invisible()
。
CallExternalAppInChunk()
为什么在 中不起作用\Sexpr{}
?因为它不返回字符值,而是返回cat()
返回的内容(即不可见的NULL
)。
为什么在代码块中不起作用CallExternalAppInSexpr()
?因为它返回一个正常的字符串,并且针织品将以在普通 R 控制台中打印字符串的方式打印它(即,使用类似索引[1]
和双引号)。