【问题标题】:knitr sanitize_fn warning incorporating plots into latex via knit2pdfknitr sanitize_fn 警告通过 knit2pdf 将绘图合并到乳胶中
【发布时间】:2018-10-21 01:30:21
【问题描述】:

我正在使用调用 knit2pdf 的驱动程序脚本在 R 中动态生成 pdf 报告。我的报告来源是latex,在一个.Rnw文件中,调用是这样的:

knit2pdf("source.Rnw",output=paste0(fname,".tex"),quiet=T)

fname 不包含任何点。

source.Rnw 包含:

<<setup, echo=FALSE >>=
opts_chunk$set(fig.path=tempfile(tmpdir="work",pattern=fname,fileext=".pdf"))
@
<<custom-dev, echo=FALSE >>=
my_pdf<-function(file,width,height) {
  pdf(file,width=5,height=2)
}
@
<<plot, echo=FALSE, results="asis", dev="my_pdf", fig.ext="pdf">>=
# A ggplot chart
print(g) 
@

报告没问题,但以下警告是从生成的 knitr 的 sanitize_fn:

图形路径中的点替换为 _ ("work/fname_pdfplot")

显然,有问题的 .来自 opts_chunk 中的 fileext。但是,如果我将该 fileext 更改为“_pdf”,我根本不会在报告中得到绘图,并且 Latex 会引发关于找不到文件 (fname_pdfplot-1) 的错误。

关于如何 (a) 正确执行此操作以便没有警告,或 (b) 执行此操作但抑制此特定警告的想法?

编辑 1:

这是一个不使用 fileext 的 source.Rnw 的工作示例。这似乎更接近,因为现在由于将 work\fname... 放在 includegraphics 而不是 work/fname... 中,它会因错误而中断,如果我将反斜杠更改为正确的斜杠,它会干净地编译。

tempfile 正在返回 work\fname...,所以也许我的解决方法只是重新转义那些反斜杠(或用正斜杠替换它们)。这是我早该知道的事情吗?

\documentclass[titlepage]{article}
\usepackage[utf8]{inputenc}
\usepackage[headheight=36pt, foot=24pt, top=1in, bottom=1in, left=1in, right=1in, landscape]{geometry}
\usepackage{hyperref}
\usepackage{bookmark}
\usepackage{fancyhdr}
\usepackage{longtable}
\usepackage{multirow}
\usepackage{float}
\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{microtype}
\usepackage{libertine}
\usepackage{parskip}
\usepackage{environ}
\usepackage{preview}
\usepackage[labelformat=empty]{caption}
\usepackage{amssymb}
\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}
\usepackage{picture}
\usepackage{needspace}
\usepackage{adjustbox}
\usepackage{graphicx}
\pagestyle{fancy}
\raggedbottom
\renewcommand\familydefault{\sfdefault}
\newcommand{\helv}{%
\fontfamily{phv}\fontseries{m}\fontsize{8}{10}\selectfont}
\newcommand{\mycopyright}{\helv Copyright.}
\cfoot{\mycopyright}
\rhead{\textbf{\Sexpr{firstname} \Sexpr{lastname}} \\ \Sexpr{oafr} to \Sexpr{eoafr} \\ Page \thepage}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\footrulewidth}{0.4pt}
\fancypagestyle{fancytitlepage}
{
\fancyhf{}
\cfoot{\mycopyright}
\rhead{}
\renewcommand{\headrulewidth}{0pt}
}
\linespread{1.2}
\usepackage{sectsty}
\allsectionsfont{\sffamily}
\partfont{\centering}

\makeatletter
\newcommand{\sectbox}[1]{%
\noindent\protect\colorbox{gray!40}{%
\@tempdima=\hsize
\advance\@tempdima by-2\fboxsep
\advance\@tempdima by-2\fboxrule
\protect\parbox{\@tempdima}{%
\smallskip
% extra commands here
\centering
#1\smallskip
}}}
\newcommand{\subsectbox}[1]{%
\noindent\protect\colorbox{gray!20}{%
\@tempdima=\hsize
\advance\@tempdima by-2\fboxsep
\advance\@tempdima by-2\fboxrule
\protect\parbox{\@tempdima}{%
\smallskip
% extra commands here
#1\smallskip
}}}
\makeatother
\sectionfont{\sectbox}
\subsubsectionfont{\subsectbox}
\makeatletter
\newcommand\cellwidth{\TX@col@width}
\makeatother


\newlength\foo
\NewEnviron{recipe}{%
\begin{adjustbox}{minipage=\linewidth,gstore totalheight=\foo, gobble}
\BODY
\end{adjustbox}
\needspace{\foo}
\BODY%
}


<<setup, echo=FALSE >>=
opts_chunk$set(fig.path = tempfile(tmpdir="work",pattern=fname))
@


\hyphenpenalty=100000

\begin{document}
\raggedbottom
\setlength{\parskip}{0pt}


<<custom-dev,echo=FALSE>>=
wkld_pdf<-function(file,width,height) {
  pdf(file,width=5,height=2)
}
@

<<wkld, echo=FALSE, results='asis',fig.align="center",dev="wkld_pdf",fig.ext="pdf">>=
if (!is.na(wkld.team) | !is.na(wkld.res)) {
  g<-pltr$workload.chart(wkld.team,wkld.res,firstname)
  print(g)
}
@


\end{document}

在上面的例子中,文件work\fname61c28cd1a0awkld-1.pdf是正确创建的,但是生成的tex有:

{\centering \includegraphics[width=\maxwidth]{work\fname61c28cd1a0awkld-1} 

}

因此没有找到它。

【问题讨论】:

  • 我将 fileext 更改为“_pdf”,并且 pdf 编译良好,没有错误(或警告)消息。你能提供更多信息吗?生成的绘图 pdf 的文件名是什么? tex文件中\includegraphics指向的文件名是什么?
  • fig.path 应该包含文件名的前缀,而不是全名,所以我将 fileext 排除在 tempfile() 调用之外。我无法检查这一点,因为您没有发布可重现的示例。
  • @user2554330(和 Weihuang),感谢您的建议。都不适合我。忽略 fileext,生成的绘图 pdf 为:“work\fname.pdf”,正如预期的那样,但 includegraphics 中的文件名是:“work\fname”。让我看看能否为您提供一个足够小且可重现的示例。

标签: r knitr sweave rnw


【解决方案1】:

似乎省略 fileext 可以(并且可能将其设置为 _pdf 也可以)以消除警告。

还需要将 tempfile 生成的 \ 替换为 / 以防止生成的 includegraphics 调用发出另一个警告,因为在链中的某处,\ 被评估为 .这有效:

opts_chunk$set(fig.path = gsub('\\\\','/',tempfile(tmpdir="work",pattern=fname)))

感谢您帮我追踪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 2014-01-18
    相关资源
    最近更新 更多