вязание с латексной петлей

Извините, если это глупый вопрос, но кто-нибудь знает, как зациклить R-функции в Knitr? Моя проблема до сих пор заключается в передаче переменной из латекса в функцию R. Я пытаюсь сделать что-то вроде этого:

\documentclass{article}
\usepackage{forloop}
\newcounter{ind}  
\begin{document}

%Simple R function:
<<simpleRFun, results='asis' ,echo=FALSE>>=
simpleRFun = function(ind){
  set.seed(ind) ;
  plot(runif(100)) ;
}
@

%Run the function for value of 1
<<>>=
simpleRFun(1)
@

%Run the function for value of 2
<<>>=
simpleRFun(2)
@

%Loop over values of 1 and 2:
\forloop{ind}{1}{\value{ind} < 3}{
   \arabic{ind}
}

%Loop over values of 1 and 2 and pass to R function:
%Everything runs fine until this line:
\forloop{ind}{1}{\value{ind} < 3}{
<<>>=
simpleRFun(ind)
@
}

\end{document}

Я получаю следующую ошибку:

Runaway argument?
 #### Error: object 'ind' not found \end {verbatim} \end {kframe} \end \ETC.
./knitr-minimal.tex:97: Paragraph ended before \@xverbatim was complete.
<to be read again> 
                   \par 
l.97 }

Заранее спасибо за помощь.


person Jim Crozier    schedule 03.07.2012    source источник
comment
почему вы используете results='asis' для первого фрагмента? это не имеет смысла, потому что этот фрагмент не имеет текстового вывода; более того, вы также скрыли исходный код R с помощью echo=FALSE, поэтому в tex практически ничего не будет записано.   -  person Yihui Xie    schedule 04.07.2012
comment
если ничего не помогает, вы, вероятно, можете сделать это с помощью brew и вывести файл, пригодный для вязания.   -  person baptiste    schedule 04.07.2012


Ответы (1)


Я не думаю, что вы можете делать то, что вы пытаетесь сделать (по крайней мере, не так, как вы пытаетесь это сделать). Функция knitr запускает весь код R, ничего не делая с кодом LaTeX, затем вы используете LaTeX для результатов, и он не запускает R для части R.

Можете ли вы переделать свой цикл, чтобы выполнить цикл в R, чтобы knitr поместил результаты цикла в LaTeX?

Либо так, либо вам нужно расширение для LaTeX, которое запустит для вас R-часть.

person Greg Snow    schedule 03.07.2012
comment
Грег, спасибо за отзыв. Но я почти уверен, что это будет работать таким образом, и в этом есть свои преимущества, а именно то, что я могу вставить латекс на самом уровне петли. Код %Everything работает нормально до тех пор, пока эта строка: \forloop{ind}{1}{\value{ind} ‹ 3}{ ‹‹››= simpleRFun(1) @ } не запустит код R нормально (дважды), только для та же переменная (здесь для значения 1). Мне просто нужно получить переменную из цикла для передачи в R. Я считаю, что проблема в моем непонимании с моей стороны того, как передавать переменные среды в латексе. Спасибо еще раз. - person Jim Crozier; 04.07.2012
comment
Вы действительно уверены, что R запускает этот раздел дважды? У вас есть переменная с именем ind в вашей рабочей области R? (если это так, удалите его и повторите попытку, вместо этого вы можете получить сообщение об ошибке). То, что я думаю, происходит выше, так это то, что knitr запускает SimpleRfun(ind) один раз в R, игнорируя цикл LaTeX for и используя локальную для R копию ind, затем LaTeX берет этот вывод и включает его дважды. knitr игнорирует (и передает) весь код LaTeX (включая цикл) и просто заменяет код R своим выводом, затем LaTeX обрабатывает файл только с выводом, без остатка кода. - person Greg Snow; 04.07.2012
comment
Ааа, я верю, что ты прав. Я только что добавил 'ind' к графику (main= ind), и это, как вы говорите, просто повторяет график дважды. Знаете ли вы вместо этого какой-либо способ добавления прямого латекса в цикл внутри моего фрагмента R? Мне нужно, чтобы латекс обновлялся на каждом интервале цикла. Спасибо. - person Jim Crozier; 04.07.2012
comment
Я не совсем понимаю, что вы на самом деле хотите здесь сделать; если вы хотите создать два графика в цикле, почему бы не for (i in 1:2) simpleRFun(i)? Если вы хотите написать собственный вывод TeX из фрагментов R, вы можете использовать параметр фрагмента results='asis' в сочетании с некоторыми операторами cat() в коде R. - person Yihui Xie; 04.07.2012
comment
Спасибо Yihui, это помогает. У меня были некоторые проблемы с контролем вывода циклов в фрагментах R, порядок графиков, кажется, перепутался. А вот с вызовом некоторых функций я думаю, что разобрался. Кстати, вы знаете, почему cat() рендерит TeX? Я пытался использовать print() и paste(). - person Jim Crozier; 04.07.2012
comment
@JimCrozier Функция paste просто объединяет строки вместе, но не печатает их (но если вы не присваиваете результаты, то для результатов вызывается печать). Функция print используется для красивой печати или форматирования вывода и иногда показывает только подмножество печатаемого объекта и может добавлять дополнительную информацию. Функция cat вставляет свои аргументы вместе, а затем выводит их как есть на экран или в файл (название cat происходит от распространенного неправильного использования команды unix cat, которая изначально была сокращением от concatenate). - person Greg Snow; 04.07.2012