Knitr:模仿私有和公共块变量

时间:2020-08-08 16:53:34

标签: r scope knitr private

通用方法

在大型项目中,根据语言,对象,模块,类,名称空间等来组织代码。其背后的原理是,将仅在这些单元中可见的变量(和方法)与全局可访问的变量分开。

编织器Rnw和Rmd存在的问题

Rnw和Rmd文档中的代码需要分组为以 chunks 表示的块。这种逻辑鼓励您根据单独的独立单元来思考您的项目。但是,尽管我们可能将块视为独立块,但所有块变量和函数都位于同一全局环境中。结果,块中设置的变量可以被后续变量覆盖。这很容易出错,因为块可能会意外破坏,重置或更改旨在由多个块共享的变量。

可能的解决方案

没有设置“私有”和“公共”块变量的方法。所以我正在使用这种策略。

我为打算在块之间共享的变量创建了一个全局G环境:

G <- new.env()

当一个块修改了要重用的变量x1, x2, ...时,我在块的末尾设置了它们:

G$x1 <- x1
G$x1 <- x2

在需要这些变量的块的开头,我得到了:

x1 <- G$x1
x2 <- G$x2

方法(函数)也是如此:f1, f2, ...

更少混乱

对于大型文档,为避免混乱,我可以使用:

local({
  x1 <- G$x1  
  x2 <- G$x2
  ...
  ## If modified x values need to be persistent:
  G$x1 <- x1
  G$x2 <- x2
})

这些看起来像黑客一样,我想知道您是否有(更)可靠的解决方案。

0 个答案:

没有答案