我试图在我的 knitr 文档和打印图中包含一些 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 上发布了要求包开发人员澄清的问题。
更新 2 来自 INLA 开发人员小组的 Havard Rue 在 Google Groups 上发布了 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
控件似乎不再起作用,因此需要进行一些修补以放置和调整大小。 最佳答案
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
的其他部分。关于r - 在 R 和 knitr 中,如何绘制 INLA 结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21534751/