使用胶水:: glue

时间:2020-03-08 10:42:14

标签: r namespaces r-environment r-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___}

是否有更好/更清洁的方法?

1 个答案:

答案 0 :(得分:2)

由于值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