问题
I feel like this should be a really easy task, but I can't seem to find the answer online. I simply want to do something like this:
stringr::str_interp("x <- ${rnorm(1)}") %>% parse(text = .) %>% eval()
But that doesn't work; when I call x
it tells me it cannot be found. I know it's a valid series of functions because this works:
eval(parse(text = stringr::str_interp("x <- ${rnorm(1)}")))
Any idea how to achieve this? Thanks!
NOTE: I'm using the github version of stringr
, which is where the str_interp function comes from.
回答1:
There are a couple of problems here. First, nested functions get evaluated from the inside out, so it should be
str_interp --> parse --> eval
since parse()
goes inside eval()
. String it, parse it, evaluate it. Next, you will need to evaluate it in an environment other than the default environment of eval()
, which is the parent frame. I chose the global environment.
library(magrittr)
str_interp("x <- ${rnorm(1)}") %>% parse(text = .) %>% eval(globalenv())
x
# [1] 0.1542613
Note: The necessary functions to reproduce this are in the stringr
development version, found here: https://github.com/hadley/stringr/blob/master/R/interp.R
来源:https://stackoverflow.com/questions/33161303/how-to-maintain-defaults-in-a-function-when-using-the-pipe-in-r