在函数内部分配命名空间变量

时间:2013-10-07 07:33:32

标签: r namespaces

我很难在函数内部分配命名空间变量。考虑使用CRAN包“qcc”的这个例子:qcc()生成一个图,但是 该图的显示选项由qcc.options()控制。

在全球工作时,一切都很好:

library(qcc)
qcc.options(bg.margin="red")        # sets margin background colour, i.e.
                                    # qcc:::.qcc.options$bg.margin is "red"
qcc(rnorm(100), type = "xbar.one")  # generates a plot with red margin

但是当在函数的本地环境中工作时,qccqcc.options似乎使用不同的命名空间:

foo <- function(x){
   qcc.options(bg.margin=x)
   qcc(rnorm(100), type = "xbar.one")
}

foo("green")  # generates a default plot with grey margins

2 个答案:

答案 0 :(得分:4)

这是一个丑陋的黑客:

foo <- function(x){
  old.qcc.options <- get(".qcc.options", asNamespace("qcc"))
  assign(".qcc.options", qcc.options(bg.margin=x), asNamespace("qcc"))
  res <- qcc(rnorm(100), type = "xbar.one")
  assign(".qcc.options", old.qcc.options, asNamespace("qcc"))
  invisible(res)
}

foo("green")

当然,通过更改qcc.options可以更好地解决范围问题。您应该联系软件包维护者。

答案 1 :(得分:3)

这是因为qcc.options存储了.qcc.options变量。在全局工作,这是qcc:::.qcc.options,但当你在函数内部时,它将它存储在一个名为.qcc.options的局部变量中,因此当你尝试使用plot.qcc时(称为qccqcc:::.qcc.options)它从全局(非导出).qcc.options而不是本地bar <- function(x){ pre <- qcc:::.qcc.options pre.marg <- qcc.options("bg.margin") qcc.options(bg.margin=x) post1 <- qcc:::.qcc.options post2 <- .qcc.options post.marg <- qcc.options("bg.margin") qcc(rnorm(100), type = "xbar.one") list(pre,post1,post2,pre.marg,post.marg) } bar('green') 检索选项。

这是一个显示选项发生情况的函数:

qcc.options

如果查看结果,您会看到bg.margin创建局部变量并将其"green"的值更改为plot.qcc,但这不是随后引用的对象assignInNamespace

似乎你应该从软件包维护者那里请求一些代码修改,因为这可能不是最好的设置。

编辑:解决方法是使用foo <- function(x){ qcc.options(bg.margin=x) assignInNamespace('.qcc.options',.qcc.options,ns='qcc') qcc(rnorm(100), type = "xbar.one") } foo('green') 来使用局部变量来覆盖全局变量。 (显然,这会全局更改参数,并且会影响所有后续绘图,除非更新参数。)

{{1}}

enter image description here