Лучший способ справиться с пространством имен при использовании glue :: glue - PullRequest
0 голосов
/ 08 марта 2020

Я хочу создать функцию, которая сама использует удивительную функцию 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 Ответ

2 голосов
/ 08 марта 2020

Поскольку значение 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
...