在使用Knitr和LaTex编写报告时加载R包

时间:2015-09-08 18:27:37

标签: r latex knitr

我有以下组合系统用于编写Knitr和LaTeX的报告,

  1. Rstudio版本0.99.473,R版本3.2.2
  2. Knitr_1.11
  3. MiKTeX 2.9
  4. Windows 7
  5. 示例.Rnw代码如下所示,我的问题是在“图1:测试”下面创建了一个文本字符串“latticeknitrstatsgraphicsgrDevicesutilsdatasetsmethodsbase”。我想知道如何摆脱它。

    \documentclass[letterpaper]{article}
    \title{An example}
    \author{Me}
    \date{\today{}}
    
    <<setup, include=FALSE, cache=FALSE>>=
    knit_hooks$set(myPackage = function(before, options, envir){
      if(before)
        library(lattice)  else NULL
    })
    @
    
    \begin{document}
    \maketitle
    \newpage
    \section{My section 1}
    \begin{figure}
    \caption{Test}\label{fig:GofBase}
    <<myPackage=TRUE, echo=FALSE, results='asis', cache=TRUE, fig.show='hold', fig.align='center', warning=FALSE>>=
    xyplot(rnorm(100)~rnorm(100))
    @
    \end{figure}
    
    \end{document}
    

2 个答案:

答案 0 :(得分:1)

由于问题的定义不是很明确,而最小的例子并不是绝对的&#34; minimal&#34;,这里有一个改进的版本:

问题

为什么以下最小示例会在输出中添加latticeknitrstatsgraphicsgrDevicesutilsdatasetsmethodsbase之类的字符串?

\documentclass{article}

<<setup>>=
knit_hooks$set(myPackage = function(before, options, envir){

    if(before) library(lattice)
})
@

\begin{document}
<<myPackage=TRUE>>=
xyplot(rnorm(100)~rnorm(100))
@
\end{document}

答案

这与lattice无关,而且它不是knitr chunk hooks的特殊功能。

会发生什么?

当chunk hook返回一个字符值时,该值包含在输出中:

  

在knitr中,钩子也可用于将文本插入输出。为此,钩子函数必须返回一个字符结果。 [knitr: hooks]

在这种情况下,钩子没有明确的返回值。因此,返回if()的返回值。 if()依次返回library返回的值:

  

if返回已计算表达式的值,如果没有,则返回NULL(如果没有其他值,则可能会发生这种情况)。 [见?"if"]

最后:

  

library返回(无形)附加包列表[请参阅?libray]

如何避免它?

首先,这个例子并不是很好。没有理由使用chunk hook加载包。如果需要lattice,则应将其加载到setup块中。

但是可能存在类似的块挂钩 有用的情况。然后,解决方案是明确返回NULL

knit_hooks$set(myPackage = function(before, options, envir){

    if(before) library(lattice)
    return(NULL)
  })

答案 1 :(得分:0)

这是一个最低限度更改版本,#34;适用于我&#34; (也来自RStudio)

   <table class="data">
        <thead>
            <tr>
                <th onclick="javascript:void(0);"><bean:message key="jsp.sp.jobs.jobData.jobNumber"/></th>
                <th onclick="javascript:void(0);"><bean:message key="jsp.sp.jobs.jobData.jobName"/></th>
                <th onclick="javascript:void(0);"><bean:message key="jsp.sp.jobs.jobData.jobDescription"/></th>
                <th onclick="javascript:void(0);"><bean:message key="jsp.sp.jobs.jobData.jobType"/></th>
            </tr>
        </thead>
        <% int i = 1; %>
        <tbody>
            <logic:iterate id="job" name="jobListe" type="com.abc.model.sp.job.JobVO">

                <bean:define id="pk" name="job" property="primaryKey"/>
                <bean:define id="rowClass">
                    <%=job.equals(serviceProtokollDRS.getSelectedJob()) ? 
                            "mark" : Globalerie.EVEN_OR_ODD[i]%>
                </bean:define>

                <tr class="<bean:write name="rowClass"/>" id="<bean:write name="pk"/>"
                    onclick="javascript:Job.select('<bean:write name="pk"/>');">
                    <td><bean:write name="job" property="jobNummer"/></td>
                    <td><bean:write name="job" property="jobName"/></td>
                    <td><bean:write name="job" property="desc"/></td>
                    <td><bean:write name="job" property="type"/></td>
                </tr>
                <% i = 1 -i; %>
            </logic:iterate>
        </tbody>
    </table>

我在第一个块中添加了\documentclass[letterpaper]{article} \title{An example} \author{Me} \date{\today{}} <<setup, include=FALSE, cache=FALSE, echo=FALSE>>= knit_hooks$set(myPackage = function(before, options, envir){ if(before) library(lattice) else NULL }) @ \begin{document} %\SweaveOpts{concordance=TRUE} \maketitle \newpage \section{My section 1} \begin{figure} \caption{Test}\label{fig:GofBase} <<myPackage=TRUE, echo=FALSE, cache=FALSE, fig.show='hold', fig.align='center', warning=FALSE>>= print(xyplot(rnorm(100)~rnorm(100))) @ \end{figure} \end{document} ,并从第二个块中删除了echo=FALSE