【发布时间】:2015-10-07 01:48:32
【问题描述】:
我在使用 Knitr 时获得了很多乐趣,但注意到我以一种糟糕的方式重用代码 - 剪切和粘贴。在我的示例中,我想加载一个数据集,计算一些统计数据并打印它们,然后绘制数据集——用几个块很容易做到,但如果我想对另一个数据集做同样的事情,我必须复制并粘贴块并仅更改数据集的名称。
假设我有这样的事情:
<p>Load the dataset <tt>dataset01</tt></p>
<!--begin.rcode load-dataset01
# Create an alias so there is no need to change it several times in the
# chunks
myDataset <- dataset01
a <- calcSomeStats(myDataset)
input <- myDataset[,1:2]
ideal <- class.ind(myDataset$label)
end.rcode-->
<p>Now let's plot it</p>
<!--begin.rcode plot-dataset01, fig.width=10, fig.height=10
neurons <- 1
NNET = nnet(input, ideal, size=neurons,softmax=TRUE)
plotnet(NNET)
par(pty="s",xpd=T, mar=par()$mar+c(0,0,0,2))
axis(1, at = seq(bbox[1],bbox[2], by = 2), las=1)
axis(2, at = seq(bbox[1],bbox[2], by = 2), las=2)
points(myDataset$x,myDataset$y,
col=myPal[unclass(myDataset$label)],cex=2,pch=16)
legend("topright", levels(factor(myDataset$label)),fill=myPal,inset=c(-0.1,0))
end.rcode-->
代码并不完整,还有其他部分我仍在开发中,但它正在工作。
我的问题是,考虑到上面显示为代码的两个块,哪一个是重用它的最佳(或 Riest)方法?假设我有几十个数据集的列表,并且我想在它们上运行相同的块,甚至可以替换非 R、HTML 部分。有可能吗?
我天真地尝试创建一个函数,但因为它是这样开始的:
<!--begin.rcode
abc <- function(n)
{
<!--begin.rcode howdoInamethischunkwithanuniquename
n <- n*2
end.rcode-->
}
end.rcode-->
它不起作用(错误:输入意外结束)
谢谢 拉斐尔
编辑:Using loops with knitr to produce multiple pdf reports... need a little help to get me over the hump 和 https://github.com/yihui/knitr/issues/435 中有类似问题的答案,但它们涵盖 LaTeX 和/或 R markdown,而不是 HTML。
另一个编辑:@Yuhui 评论后我尝试过的事情:
对两个块使用相同的标签
<!--begin.rcode chunkA, echo=TRUE, results='hide'
x <- rnorm(100)
end.rcode-->
<p>Plot it?</p>
<!--begin.rcode chunkA, echo=FALSE, results='markup'
mean(x)
end.rcode-->
这样我得到“parse_block(g[-1], g[1], params.src) 中的错误:重复标签'chunkA'”消息。
使用块选项 ref.label
<!--begin.rcode chunkA, echo=TRUE, results='hide'
x <- rnorm(100)
end.rcode-->
<p>Plot it?</p>
<!--begin.rcode chunkB, ref.label='chunkA', echo=FALSE, results='markup'
mean(x)
end.rcode-->
有了这个,我得到了 R 代码 (x
更多信息
我的场景是有几个具有相同结构(x,y,标签)的小数据帧,我想在一个块“A”中处理它们,并在另一个块“B”中用相似的参数绘制它们。如果我在不重用代码的情况下这样做,我必须多次复制和粘贴块“A”和“B”,这不是一个好主意。
我知道我无法将参数传递给 HTML 块,http://yihui.name/knitr/demo/reference/ 的食谱似乎接近我需要的,但我不知道如何在 R+HTML 中执行它们。
【问题讨论】:
-
看看yihui.name/knitr/demo/reference是否有帮助(
<<>>)。 -
感谢您的帮助,但我仍然很困惑,无法获得我正在寻找的结果。请参阅编辑后的问题以获取更多示例和信息。