Как использовать код переменной R в блоке Knitr? - PullRequest
0 голосов
/ 27 января 2019

Я хочу продемонстрировать использование фрагмента кода R.Но я хочу, чтобы сам код был переменным.

Пример двух задач:

  1. Произвольно выбрать две переменные из фрейма данных и добавить эти столбцы.
  2. Произвольно выберите набор чисел и вычислите их медиану.

Определенный фрейм данных:

<<echo=FALSE,results='hide'>>=
df <- data.frame(x1 = sample(1:5, 3), x2 = sample(1:5, 3), 
                 x3 = sample(1:5, 3), x4 = sample(1:5, 3))
@

Вот так должен выглядеть окончательный выходной кодпрезентация:

<<foo_chunk,results='markup',echo=TRUE>>=
# You can add two columns by:
s = df$x1 + df$x3
# The median:
median(c(2, 31, 14, 5, 6))
@

enter image description here

В настоящее время я достигаю этого с помощью следующего кода.Но я не могу использовать красивую подсветку кода, доступную для кусков кода knitr:

<<results='asis',echo=FALSE>>=
cn <- sample(colnames(df), 2)
cat("\\# You can add two columns by:\n\n")
cat("s = df\\$", cn[1], " + df\\$", cn[2], "\n\n", sep = "")
x <- sample(1:100, 5)
cat("\\# The median:\n\n")
cat("median(c(", paste0(x, collapse = ", "), "))\n\n", sep = "")
cat("\\#\\#", median(x), "\n")
@

UPDATE:

Я нашел способ захвата вывода, похожий на foo_chunk выше:

<<echo=FALSE,results='hide'>>=
df <- data.frame(x1 = sample(1:5, 3), x2 = sample(1:5, 3),
                 x3 = sample(1:5, 3), x4 = sample(1:5, 3))

foo <- function(cn = colnames(df), 
                x = sample(1:100, 5)) {
  return(c(
    paste0("# You can add two columns by:"),
    paste0("s = df$", cn[1], " + df$", cn[2]),
    paste0("# The Median:"),
    paste0("median(c(", paste0(x, collapse = ", "), "))")
    ))
}
@

<<code=capture.output(cat(foo(), sep="\n"))>>= 
@

Этот код выдаст выходные данные без каких-либо побочных эффектов (т. Е. Создаст новый временный файл, например "foo.R").

Будем весьма благодарны за любые более эффективные решения.

1 Ответ

0 голосов
/ 27 января 2019

Вы можете сделать это, вызвав хуки, определенные knitr::render_latex() напрямую (см. https://yihui.name/knitr/hooks/),, но это выглядит сложно. Почему бы просто не записать код переменной в отдельный файл и включить его?

Например,

\documentclass{article}

\begin{document}

<<echo=FALSE,results='hide'>>=
df <- data.frame(x1 = sample(1:5, 3), x2 = sample(1:5, 3), 
                 x3 = sample(1:5, 3), x4 = sample(1:5, 3))
@


<<echo=FALSE>>=
cn <- sample(colnames(df), 2)
x <- sample(1:100, 5)
code <- paste0(
"<<echo=TRUE>>=
# You can add two columns by
s = df$", cn[1], " + df$", cn[2], "
# The median:
median(c(", paste0(x, collapse = ", "), "))
@")
writeLines(code, "sampleCode.Rnw")
@

<<child="sampleCode.Rnw">>=
@

\end{document}

Создает вывод

enter image description here

Отредактировано, чтобы добавить:

Использование code= дополнения к вопросу делает это еще проще:

\documentclass{article}

\begin{document}

<<echo=FALSE,results='hide'>>=
df <- data.frame(x1 = sample(1:5, 3), x2 = sample(1:5, 3), 
                 x3 = sample(1:5, 3), x4 = sample(1:5, 3))

cn <- sample(colnames(df), 2)
x <- sample(1:100, 5)
code <- paste0(
"# You can add two columns by
s = df$", cn[1], " + df$", cn[2], "
# The median:
median(c(", paste0(x, collapse = ", "), "))")
@

<<code = code>>=
@

\end{document}
...