Как сохранить значения по умолчанию в функции при использовании канала в R?

Я чувствую, что это должно быть действительно легкой задачей, но я не могу найти ответ в Интернете. Я просто хочу сделать что-то вроде этого:

stringr::str_interp("x <- ${rnorm(1)}") %>% parse(text = .) %>% eval()

Но это не работает; когда я звоню x это говорит мне, что это не может быть найдено. Я знаю, что это правильный ряд функций, потому что это работает:

eval(parse(text = stringr::str_interp("x <- ${rnorm(1)}")))

Есть идеи как этого добиться? Спасибо!

ПРИМЕЧАНИЕ: я использую версию GitHub stringr, где str_interp Функция исходит от.

1 ответ

Решение

Здесь есть пара проблем. Во-первых, вложенные функции оцениваются изнутри, поэтому

str_interp --> parse --> eval

поскольку parse() идет внутрь eval(), Струни, разбери, оцени. Затем вам нужно будет оценить его в среде, отличной от среды по умолчанию eval(), который является родительским фреймом. Я выбрал глобальную среду.

library(magrittr)
str_interp("x <- ${rnorm(1)}") %>% parse(text = .) %>% eval(globalenv())
x
# [1] 0.1542613

Примечание: необходимые функции для воспроизведения этого находятся в stringr версия для разработки, найденная здесь: https://github.com/hadley/stringr/blob/master/R/interp.R

Другие вопросы по тегам