我试图在我的 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/

10-12 17:32