knitr - 在 \Sexpr 和代码块中均有效的函数

knitr - 在 \Sexpr 和代码块中均有效的函数

我努力学习针织品

针织品允许您嵌套使用该语言编写的“内联代码”片段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]和双引号)。

相关内容