4

我有时会处理很多对象,由于块之间的内存问题,重新开始会很好。考虑以下示例:

警告:我有 8GB 的​​ RAM。如果你没有太多,这可能会吃掉它。

<<chunk1>>=
a <- 1:200000000
@
<<chunk2>>=
b <- 1:200000000
@
<<chunk3>>=
c <- 1:200000000
@

这种情况下的解决方案是:

<<chunk1>>=
a <- 1:200000000
@
<<chunk2>>=
rm(a)
gc()
b <- 1:200000000
@
<<chunk3>>=
rm(b)
gc()
c <- 1:200000000
@

但是,在我的示例中(我可以发布它,因为它依赖于一个大型数据集),即使在我删除所有对象并运行之后gc()R也不会清除所有内存(只有一些)。原因在?gc

However, it can be useful to call ‘gc’ after a large object has
been removed, as this may prompt R to return memory to the
operating system.

注意重要的词mayR有很多情况是这样指定的may,因此它不是错误。

是否有一个块选项,我可以根据它knitr开始一个新R会话?

4

1 回答 1

0

我的建议是.Rnw为每个主要任务创建一个人,将它们编织到.tex文件中,然后使用\include\inputparent.Rnw文件中构建完整的项目。通过makefile.

但是,为了解决这个特定问题,为每个块使用新的 R 会话,您可以使用 R 包子进程生成 R 会话,运行所需的代码,提取结果,然后终止生成的会话。

一个简单的示例 .Rnw 文件

\documentclass{article}
\usepackage{fullpage}
\begin{document}

<<include = FALSE>>=
knitr::opts_chunk$set(collapse = FALSE)
@

<<>>=
library(subprocess)

# define a function to identify the R binary
R_binary <- function () {
  R_exe <- ifelse (tolower(.Platform$OS.type) == "windows", "R.exe", "R")
  return(file.path(R.home("bin"), R_exe))
}
@


<<>>=
# Start a subprocess running vanilla R.
subR <- subprocess::spawn_process(R_binary(), c("--vanilla --quiet"))
Sys.sleep(2) # wait for the process to spawn

# write to the process
subprocess::process_write(subR, "y <- rnorm(100, mean = 2)\n")
subprocess::process_write(subR,  "summary(y)\n")

# read from the process
subprocess::process_read(subR, PIPE_STDOUT)

# kill the process before moving on.
subprocess::process_kill(subR)
@


<<>>=
print(sessionInfo(), local = FALSE)
@

\end{document}

生成以下pdf:

在此处输入图像描述 在此处输入图像描述

于 2018-06-05T21:58:41.977 回答