【问题标题】:If-Else Statement in knitr/Sweave using R variable as conditional (Part 2)knitr/Sweave 中使用 R 变量作为条件的 If-Else 语句(第 2 部分)
【发布时间】:2015-09-10 15:27:21
【问题描述】:

我正在扩展我在这里发布的一个问题:

If-Else Statement in knitr/Sweave using R variable as conditional

我想在 LaTeX 中使用 if-else 语法,以便根据 R 变量(比如 x)的值,输出两个 LaTeX 文本段落之一。如果 x>0,则 LaTeX 段落有一个图形和一个表格。但是,如果 x

我有一个可以工作的 MWE,它基于上一篇文章中的检查答案:

\documentclass[12pt,english,nohyper]{tufte-handout}
\usepackage{tabularx}
\usepackage{longtable}

\begin{document}

<<setup, echo = FALSE>>=
library(knitr)
library(xtable)
library(ggplot2)
knit_patterns$set(header.begin = NULL)
@

<<echo=FALSE,results='asis'>>=
fname="myOutput.pdf"
pdf(fname,width=4,height=4)
print(qplot(mpg,cyl,data=mtcars))
{dev.off();invisible()}
cat(sprintf('\\begin{marginfigure}
\\includegraphics[width=0.98\\linewidth]{%s}
\\caption{\\label{mar:dataMtcars}Comments about mtcar dataset.}
\\end{marginfigure}',sub('\\.pdf','',fname)))
@

<<echo=FALSE,results='asis'>>=
x<- rnorm(1)
if (x>0){
  myDF = data.frame(a=rnorm(1:5),b=rnorm(1:5),c=rnorm(1:5))
  print(xtable(myDF,caption='Data frame comments', label='tab:myDataFrame'),floating=FALSE, tabular.environment = "longtable",include.rownames=FALSE)
}
@

<<condition, echo=FALSE>>=
if(x>0){
  text <- "Figure \\ref{mar:dataMtcars} shows the mtcars data set. The x value of \\Sexpr{x} was greater than 0. Table \\ref{tab:myDataFrame} shows my data frame."
  }else{
  text <- "Figure \\ref{mar:dataMtcars} shows the mtcars data set. The x value of \\Sexpr{x} was less than 0. We do not show a data frame."
  }
@

Testing the code: 

<<print, results='asis', echo=FALSE>>=
cat(text)
@

\end{document}

然后我将这个 MWE 保存为类似 testKnitr.Rnw 的文件,然后运行:

knit(input = "testKnitr.Rnw", output = "intermediate.Rnw")
knit2pdf(input = "intermediate.Rnw", output = "doc_final.tex")

我想知道我是否有效地创建了这段代码,特别是因为在我之前的帖子中向我指出 - 在仅使用 \Sexpr{} 的情况下 - 有更简单的解决方案。在这里织两遍有点麻烦。

有没有更简单的方法来合并我的 if/else 语句来显示包含变量值、数字和/或表格的两个段落之一,所有这些都基于变量的值?谢谢。

【问题讨论】:

    标签: r if-statement latex knitr sweave


    【解决方案1】:

    类似于related question that has been linked above 动态生成\Sexpr{} 并且在这种情况下不需要第二次解析中间输出。

    问题的代码中发生了很多事情,但这是关键块(x 获得在前一个块中分配的随机值):

    <<condition, echo=FALSE>>=
    if (x > 0) {
      text <- "Figure \\ref{mar:dataMtcars} shows the mtcars data set. The x value of \\Sexpr{x} was greater than 0. Table \\ref{tab:myDataFrame} shows my data frame."
      } else {
        text <- "Figure \\ref{mar:dataMtcars} shows the mtcars data set. The x value of \\Sexpr{x} was less than 0. We do not show a data frame."
        }
    @
    

    直接替代printing \Sexpr

    \Sexpr{} 的直接替代品是 pastesprintf(我在 if 分支中使用一个,在 else 分支中使用一个,仅用于演示):

    <<condition, echo=FALSE>>=
    if (x > 0) {
      text <- paste("Figure \\ref{mar:dataMtcars} shows the mtcars data set. The x value of", x, "was greater than 0. Table \\ref{tab:myDataFrame} shows my data frame.")
      } else {
        text <- sprintf("Figure \\ref{mar:dataMtcars} shows the mtcars data set. The x value of %f was less than 0. We do not show a data frame.", x)
        }
    @
    

    当有条件显示的文本不太长时,这很有效。否则,使用 LaTeX if-statements 可能更方便。这样做的好处是没有太多的代码被包裹在字符字符串/代码块中。然后,\Sexpr{} 可能再次有用。

    使用 LaTeX 条件表达式

    many ways to write conditional expressions in LaTeX,但最简单的形式就足够了。

    • 首先,定义一个新的if,我们称之为ifPositive\newif\ifPositive
    • 其次,使用R插入\Positivetrue\Positivefalse 进入文档。
    • 第三,使用\ifPositive … \else … \fi

      \newif\ifPositive
      
      <<condtion2, echo = FALSE, results = "asis">>=
      if (x > 0) {
        cat("\\Positivetrue")
      } else {
        cat("\\Positivefalse")
      }
      @
      
      \ifPositive
      Figure \ref{mar:dataMtcars} shows the mtcars data set. The x value of \Sexpr{x} was greater than 0. Table \ref{tab:myDataFrame} shows my data frame.
      \else
      Figure \ref{mar:dataMtcars} shows the mtcars data set. The x value of \Sexpr{x} was less than 0. We do not show a data frame.
      \fi
      

    其他说明

    在问题中有一个生成myOutput.pdf 的块。在那里,pdf()dev.off() 被使用。这不是很好的风格和kills kittens。无需绕过knitr的出图机制;即使要使用像 marginfigure 而不是 figure 这样的自定义环境。该块应替换为以下内容:

    <<dataMtcars, echo=FALSE, fig.env = "marginfigure", out.width = "0.98\\linewidth", fig.cap = "Comments about mtcar dataset.", fig.lp = "mar:">>=
    print(qplot(mpg,cyl,data=mtcars))
    @
    

    fig.lp = "mar:" 仅用于生成与问题mar:dataMtcars 完全相同的标签。如果标签fig:dataMtcars 也可以,则可以跳过。

    文档

    最后,这里是完整的文档:

    \documentclass[12pt,english,nohyper]{tufte-handout}
    \usepackage{tabularx}
    \usepackage{longtable}
    
    \begin{document}
    
    <<setup, echo = FALSE>>=
    library(knitr)
    library(xtable)
    library(ggplot2)
    @
    
    <<dataMtcars, echo=FALSE, fig.env = "marginfigure", out.width = "0.98\\linewidth", fig.cap = "Comments about mtcar dataset.", fig.lp = "mar:">>=
    print(qplot(mpg,cyl,data=mtcars))
    @
    
    <<echo=FALSE,results='asis'>>=
    x <- rnorm(1)
    if (x > 0) {
      myDF <- data.frame(a = rnorm(1:5), b = rnorm(1:5), c = rnorm(1:5))
      print(xtable(myDF, caption= 'Data frame comments', label='tab:myDataFrame'), floating = FALSE, tabular.environment = "longtable", include.rownames=FALSE)
    }
    @
    
    <<condition, echo=FALSE>>=
    if (x > 0) {
      text <- paste("Figure \\ref{mar:dataMtcars} shows the mtcars data set. The x value of", x, "was greater than 0. Table \\ref{tab:myDataFrame} shows my data frame.")
      } else {
        text <- sprintf("Figure \\ref{mar:dataMtcars} shows the mtcars data set. The x value of %f was less than 0. We do not show a data frame.", x)
        }
    @
    
      Testing the code:
    
    <<print, results='asis', echo=FALSE>>=
      cat(text)
    @
    
    \paragraph{Alternative:}
    
    \newif\ifPositive
    
    <<condtion2, echo = FALSE, results = "asis">>=
    if (x > 0) {
      cat("\\Positivetrue")
    } else {
      cat("\\Positivefalse")
    }
    @
    
    \ifPositive
    Figure \ref{mar:dataMtcars} shows the mtcars data set. The x value of \Sexpr{x} was greater than 0. Table \ref{tab:myDataFrame} shows my data frame.
    \else
    Figure \ref{mar:dataMtcars} shows the mtcars data set. The x value of \Sexpr{x} was less than 0. We do not show a data frame.
    \fi
    
    \end{document}
    

    【讨论】:

    • 非常有帮助!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2014-09-06
    • 1970-01-01
    • 2016-10-13
    • 2019-02-28
    • 2014-03-05
    相关资源
    最近更新 更多