【发布时间】:2019-01-27 14:50:13
【问题描述】:
我想演示一段 R 代码的使用。但我希望代码本身是可变的。
示例两个任务:
- 从数据框中随机选择两个变量并将它们相加 列。
- 随机选择一组数字并计算它们 中位数。
定义的数据框:
<<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))
@
目前,我正在通过以下代码实现这一点。但我无法利用可用于 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")
@
更新:
我找到了一种捕获输出的方法,类似于上面的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”)。
将不胜感激任何其他更有效的解决方案。
【问题讨论】:
标签: r latex knitr syntax-highlighting