使用 glue::glue 时处理名称空间的更好方法

Better way to deal with namespace when using glue::glue

我想创建一个函数,它本身使用很棒的 glue::glue 函数。

但是,当我想粘附一个同时存在于函数和全局环境中的变量时,我发现自己正在处理一些命名空间问题:

x=1

my_glue <- function(x, ...) {
    glue::glue(x, ...)
}
my_glue("foobar x={x}") #not the expected output
# foobar x=foobar x={x}

为了包的一致性,我宁愿保留名为 x 的变量。

我最终做了这样的事情,到目前为止效果很好,但只是推迟了问题(很多,但仍然):

my_glue2 <- function(x, ...) {
    x___=x; rm(x)
    glue::glue(x___, ...)
}
my_glue2("foobar x={x}") #problem is gone!
# foobar x=1
my_glue2("foobar x={x___}") #very unlikely but still...
# foobar x=foobar x={x___}

有better/cleaner方法吗?

由于值 x = 1 没有传递给函数,在当前情况下,一种方法是在全局环境本身中计算字符串,其中 x 的值是在将其传递给函数之前呈现。

my_glue(glue::glue("foobar x={x}"))
#foobar x=1

my_glue(glue::glue("foobar x={x}"), " More text")
#foobar x=1 More text

另一种选择(我认为这就是您正在寻找的答案)是从父环境中获取 x 的值。 glue.envir 参数,可以在其中定义评估表达式的环境。

my_glue <- function(x, ...) {
   glue::glue(x, ...,.envir = parent.frame())
}
my_glue("foobar x={x}")
#foobar x=1