在Knitr中重用块

时间:2015-07-17 10:51:46

标签: r knitr

我对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 humphttps://github.com/yihui/knitr/issues/435中的答案也有类似问题,但它们涵盖了LaTeX和/或R降价,而不是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'”消息。

使用chunk选项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&lt; -rnorm(100)),“绘制它?”然后什么也没有。将echo改为TRUE只需重复(x < - rnorm(100))。

更多信息

我的场景是有几个具有相同结构(x,y,label)的小数据帧,我想在一个块“A”中处理它们,并在另一个块“B”中用相似的参数绘制它们。如果我这样做而不重用代码,我必须多次复制并粘贴块“A”和“B”,这不是一个好主意。

我知道我无法将参数传递给HTML块,而http://yihui.name/knitr/demo/reference/处的食谱似乎接近我所需要的,但我无法弄清楚如何在R + HTML中执行它们。

2 个答案:

答案 0 :(得分:1)

好的,我明白了,我发帖就是一个例子。

据我所知,创建一个作为函数工作的knitr块是。因此,可能:

<!--begin.rcode fakeFunction
# do something with myData, assume it is defined!
end.rcode-->

<!--begin.rcode myPlot1 ref.label='fakeFunction'
myData <- iris
# Assume fakeFunction will be executed somehow with iris
end.rcode-->

<!--begin.rcode myPlot2 ref.label='fakeFunction'
myData <- cars
# Assume fakeFunction will be executed somehow with cars
end.rcode-->

将起作用是这样的:

<!--begin.rcode
myData <- iris
end.rcode-->

<!--begin.rcode plot
summary(myData)
end.rcode-->

<!--begin.rcode
myData <- cars
end.rcode-->

<!--begin.rcode plot2, ref.label='plot'
end.rcode-->

基本上我们说chunk plot2会&#34;粘贴&#34;来自块图的代码。我们不需要在plot2中定义任何其他内容,我想它无论如何都会被忽略。

但是,我还没有想出一个细节。假设我的块图正常工作(想象几十行R代码)并且想要在plot2中略微不同的行为,这将影响单行代码。根据我的理解,我无法用knitr做到这一点 - 任何人都知道如何通过编写块作为程序或函数来重用代码?

答案 1 :(得分:1)

我有类似的错误。 我所做的是以不同的方式命名块,或者根本不命名它们。

例如 {r, echo=F } some code here 这是一个没有名称

的默认代码块的示例

{r setup, echo=F } some code here 这是一个名为“setup。”的块。

基本上,如果你有所有未命名的块,或者拥有所有不同的命名块,你会没事的。