Вставьте несколько изображений в цикл for в документ Sweave

У меня есть пять изображений, хранящихся следующим образом (где «currentDirectory» — это результат, который я получаю от команды getwd()):

currentDirectory/results/thePlot_1.jpg
currentDirectory/results/thePlot_2.jpg
currentDirectory/results/thePlot_3.jpg
currentDirectory/results/thePlot_4.jpg
currentDirectory/results/thePlot_5.jpg

Я пытаюсь написать сценарий .Rnw в Rstudio, который создаст файл .tex, на котором я могу запустить pdflatex, чтобы получить файл .pdf, содержащий эти пять изображений. Ниже то, что я пробовал:

\documentclass{article}
\usepackage{float, hyperref}
\usepackage[margin=1in]{geometry}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage{caption}
\usepackage{algorithm}
\usepackage{algorithmic}

\begin{document}
\SweaveOpts{concordance=TRUE}

\author{myName}
\title{myTitle}

\maketitle

<<options, echo=FALSE>>=
library(knitr)
  opts_chunk$set(cache=TRUE)
@

\section*{mySection}

\FOR{i in 1:5}
nPlots=i
plotName = "thePlot"
outDir = "results"
\includegraphics{paste(getwd(), "/", outDir , "/", plotName, "_", i, sep="")}
\ENDFOR

\end{document}

Для чего я получаю несколько ошибок:

Строка 25: Неопределенная управляющая последовательность. Строка 29: вставлен пропущенный символ $. Строка 29: Ошибка LaTeX: файл `paste(getwd(), "/", outDir , "/", plotName, "_", i, sep="")' не найден. Строка 29: вставлен пропущенный символ $. Строка 30: Неопределенная управляющая последовательность.

Любая помощь очень ценится!

РЕДАКТИРОВАТЬ 1: я принял во внимание совет Алекса А. и изменил раздел, включив выражения \Sexpr{} следующим образом:

\FOR{i in 1:5}
\Sexpr{nPlots=i}
\Sexpr{plotName = "thePlot"}
\Sexpr{outDir = "results"}
\includegraphics{\Sexpr{paste(getwd(), "/", outDir , "/", plotName, "_", i, sep="")}}
\ENDFOR

\end{document}

Однако теперь я получаю сообщение об ошибке:

object 'i' not found

Я попытался изменить условие в цикле for, чтобы также включить \Sexpr{}, например:

\FOR{\Sexpr{i in 1:5}}

Но это вызывает у меня ошибку:

Unexpected 'in'

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ 2:

Я попытался принять во внимание совет просто поместить цикл for и вставку изображения в Rcode. Итак, я попытался использовать библиотеку jpeg и ее метод readJPEG, как показано ниже:

<<echo=FALSE>>==
library(jpeg)
@

<<plots, echo = FALSE, fig = TRUE, figs.only = TRUE, results = hide>>=
for (i in 1:5){
  nPlots=i
  plotName = "thePlot"
  outDir = "results"

  img <- readJPEG(paste(getwd(), "/", outDir , "/", plotName, "_", i, ".jpg", sep=""))
  plot(img)
}
@

\end{document}

К сожалению, это все еще приводит к ошибке:

unexpected 'in'

Кроме того, когда я запускаю только приведенный ниже код (не в цикле for или в файле .Rnw):

  nPlots=1
  plotName = "thePlot"
  outDir = "results"

  img <- readJPEG(paste(getwd(), "/", outDir , "/", plotName, "_", i, ".jpg", sep=""))
  plot(img)

Сгенерированное изображение отличается от изображения .jpeg, которое у меня есть (находится в currentDirectory/results/thePlot_1.jpg)


person Community    schedule 08.06.2015    source источник
comment
Попробуйте обернуть paste(...) в \Sexpr{}.   -  person Alex A.    schedule 08.06.2015
comment
@AlexA.: Спасибо за помощь. Кажется, это решило проблему, хотя кажется, что цикл for все еще работает не совсем так, как я надеюсь. Есть ли у вас какие-либо предложения для этой новой ошибки, которая возникает?   -  person    schedule 08.06.2015
comment
Я не думаю, что использование \For и \EndFor для включения нескольких графиков - лучший способ сделать это. (На самом деле я не думаю, что вы можете сделать это таким образом.) Я бы, вероятно, сделал блок R, например <<plots, echo = FALSE, fig = TRUE, figs.only = TRUE, results = hide>> (код R для отображения графиков) @. Это автоматически встроит их.   -  person Alex A.    schedule 08.06.2015
comment
@АлексА. Еще раз спасибо. Я пробую это сейчас из предложенного вами подхода, но сталкиваюсь с некоторыми странными ситуациями. Мне не хватает гораздо более простого способа чтения изображения в коде R? Спасибо.   -  person    schedule 08.06.2015
comment
Хм. Это странно... К сожалению, это не моя область знаний, так что, надеюсь, кто-то другой скоро присоединится, чтобы просветить нас.   -  person Alex A.    schedule 08.06.2015


Ответы (2)


Из Руководства по Sweave:

A.7 Создание нескольких фигур из одного куска фигуры не работает

Либо сохраните графики вручную и вставьте их с помощью включения LaTeX (как рекомендовано в руководстве по Sweave), либо переключитесь на Knitr. Я бы рекомендовал последнее.

person Thomas    schedule 11.06.2015
comment
Спасибо за совет. Это может показаться очевидным, но я не понимаю перехода на Knitr. Когда я сравниваю код, который я написал, с минимальным примером Knitr, они кажутся почти одинаковыми (github.com/yihui/knitr/blob/master/inst/examples/). Мне просто очень трудно понять, как хотя бы начать исправлять это настолько безболезненно, насколько это возможно. - person ; 16.06.2015
comment
@LanneR Во многих случаях .Rnw, написанный для Sweave, отлично подойдет для Knitr, но иногда вам нужно внести некоторые изменения. В этом документе описывается переход: yihui.name/knitr/demo/sweave. Единственное отличие состоит в том, что Sweave на самом деле не находится в активной разработке и имеет ограничения (например, те, с которыми вы сталкиваетесь), а Knitr находится в активной разработке (и не имеет ограничений, с которыми вы сталкиваетесь). - person Thomas; 16.06.2015
comment
Спасибо. Я использовал команду Sweave2knitr, опубликованную в блоге Yihui. Единственным изменением стал раздел после \SweaveOpts{concordance=TRUE} (см. третье редактирование). Я все еще получаю сообщение об ошибке с оператором \FOR как неопределенная управляющая последовательность. Еще раз спасибо за предложения. - person ; 17.06.2015
comment
@LanneR Я бы посоветовал вам опубликовать эти проблемы как новый вопрос и отменить внесенные здесь изменения. Ваш первоначальный вопрос разрешен моим ответом, и вы задаете новый вопрос, поэтому стандартная процедура - открыть новую тему. - person Thomas; 17.06.2015
comment
Хорошо, я так и сделал. - person ; 17.06.2015
comment
В конце концов я попытался переключиться на вязание, которое вы рекомендовали. Однако у меня все еще есть проблема с синтаксисом. Если у вас есть какие-либо знания и/или рекомендации по этому поводу, я разместил проблему здесь (stackoverflow.com/questions/30901733/). Спасибо. - person ; 01.07.2015

для тех, кто может поэкспериментировать с латексными и трикотажными петлями изображений, я делаю это для участков, например. нравится:

<<echo=F, cache=T,cache.rebuild=T, results='asis' >>=

pictures <- c(pathtoimage1, pathtoimage2, pathtoimage3)   

plots <- ""
for(pic in pictures){
plots <- c(plots,paste("\\includegraphics[width=0.5\\linewidth]{",pic,"}",sep=""))
}
cat(plots)

@

Я считаю, что results='asis' делает свое дело. Но я не эксперт. Это легко создает для меня сотни графиков в одном фрагменте.

Ваше здоровье

person kn1g    schedule 16.05.2020