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