【问题标题】:How to avoid polluting the current scope (with `library(...)`)如何避免污染当前范围(使用 `library(...)`)
【发布时间】:2017-06-04 09:52:36
【问题描述】:

作为一项长期政策,我避免将名称导入(也称为“污染”)当前范围,而是在引用不同包中定义的项目时使用完全限定名称。

下面的脚本表明,在 R 中,使用限定名称本身是不够的。

#!/usr/bin/env Rscript

set.seed(0)

x <- local({
         x0 <- matrix(rnbinom(80, size = 5, mu = 10), nrow = 20)
         `rownames<-`(rbind(0, c(0, 0, 2, 2), x0),
                      paste("Tag", 1:(nrow(x0) + 2), sep = "."))
     })

y <- edgeR::DGEList(counts = x,
                    group = rep(1:2, each = 2),
                    lib.size = 1001:1004)

## library(edgeR)

y[1, 1]

脚本失败

Error in y[1, 1] : incorrect number of dimensions
Execution halted

脚本的唯一错误似乎是在失败语句之前的某处没有包含 library(edgeR) 行,因为如果取消注释掉的行,错误就会消失。

这是巫毒教,恕我直言。

有没有办法避免错误而不用library(edgeR) 污染当前范围?

【问题讨论】:

  • 看看模块包。
  • @G.Grothendieck:感谢您的建议,但我承认,在快速浏览modules 网站后,我不清楚这个包在这种情况下有何帮助。你介意详细说明一下吗?

标签: r import fully-qualified-naming


【解决方案1】:

当你避免加载edgeR 包时,你也避免加载[.DGEList 方法,这是执行y[1, 1] 所必需的。如果您不想加载edgeR 库,则需要直接调用提取函数:

edgeR::`[.DGEList`(y, 1, 1)

如果你不喜欢完全限定的语法,你可以用

引入你需要的方法
`[.DGEList` <- edgeR::`[.DGEList`

然后y[1, 1] 将按预期工作。但这是另一种形式的污染,我不确定我是否会推荐它作为通用解决方案。

【讨论】:

  • 谢谢!顺便说一句,我不考虑`[.DGEList` &lt;- edgeR::`[.DGEList` 污染,因为它是明确的。
猜你喜欢
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多