我正在尝试在我的编织文档中添加一些INLA代码并打印图表:
使用一个简单的例子
\documentclass{article}
\begin{document}
<<c1>>=
library("INLA")
n = 100
z = runif(n)
eta = 1 + 0.1*z
N = 20
p = exp(eta)/(1+exp(eta))
y = rbinom(n, size = N, prob = p)
r = inla(y ~ 1 + z,
data = data.frame(y, z),
family = "binomial",
Ntrials = rep(N, n),
control.family = list(link = "logit"),
control.predictor = list(compute=TRUE)
)
@
<<c2>>=
plot(r, single=TRUE)
@
\end{document}
当我在RStudio中以交互方式运行此代码时,一切正常,我得到了一系列图表。然而,在编织文档之后 - 没有一个被包括在内。
我该如何解决?
更新1我在Google groups上发布了问题,要求包装软件包开发人员澄清。
UPDATE 2 INLA开发者小组的Havard Rue在Google网上论坛上发布了一个Sweave解决方案。诀窍是:
<<results=tex, echo=FALSE>>=
figs = plot(r, single=TRUE, postscript=TRUE, prefix="Sweave/ex1/figure-")
cat("\\begin{figure}[tbp]\n")
cat("\n")
cat("\\centering\n")
for(i in 1:length(figs)) {
cat("\\includegraphics[width=7cm,height=7cm,angle=-90]{",
gsub("[.]eps$","",figs[i]), "}\n", sep="")
}
cat("\\caption{XXX}\n")
cat("\\label{fig:11}\n")
cat("\\end{figure}\n")
@
这确实可以胜任这项工作。图形在指定目录中创建,然后放在pdf输出中。然而,由于knitr
控件似乎不再起作用,因此需要进行一些修改以进行放置和调整大小。
答案 0 :(得分:3)
INLA
似乎在做一些非标准的事情。如果没有在RStudio中运行,它会在绘图时打开一个新的绘图窗口(设备)。我认为这意味着knitr
没有看到情节,因为它们不在knitr
正在使用/监控的设备上。
<击> 撞击>
<击>也许你可以通过添加一个块来欺骗INLA
<<>>=
op <- options(device="RStudioGD")
@
在你的knitr文件的开头和
<<>>=
options(op)
@
在文件的末尾(将默认设备重置为适当的位置)。
这是未经测试的,因为我没有安装INLA
。
<击> 撞击>
可能需要修改INLA
(特别是inla.dev.new
)才能打开新设备。一种可行的方法是
noop <- function(...) NULL
assignInNamespace("inla.dev.new", noop, ns="INLA")
这也是未经测试的,可能会破坏INLA
的其他部分。
答案 1 :(得分:2)
对INLA开发者之一的讨论的回应
plot()的用途是用结果图生成图(是的,很多)。它们旨在使用标准GUI /终端或RStudio进行交互式使用。
在knitr环境或Sweave中使用时,这种生成图的方式可能不再合适。当有人告诉我们时,我们的包中的问题是固定的。上面提到的修复是由于我自己对Sweave的有限经验,并且众所周知,它不是最好的。如果有人告诉我们他们想要/需要什么,我们很乐意为knitr / Sweave环境添加任何好的解决方案。
最佳, HåvardRue
www.r-inla.org
答案 2 :(得分:0)
我偶然发现了INLAutils
package,它有望用ggplot2
解决问题。示例代码:
data(Epil)
##Define the model
formula = y ~ Trt + Age + V4 +
f(Ind, model="iid") + f(rand,model="iid")
result = inla(formula, family="poisson", data = Epil, control.predictor = list(compute = TRUE))
p <- autoplot(result)
结果图: