我很难在函数内部分配命名空间变量。考虑使用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
但是当在函数的本地环境中工作时,qcc
和qcc.options
似乎使用不同的命名空间:
foo <- function(x){
qcc.options(bg.margin=x)
qcc(rnorm(100), type = "xbar.one")
}
foo("green") # generates a default plot with grey margins
答案 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
时(称为qcc
按qcc:::.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}}