问题
I expect this code to set plt
equal to 10:
> var = "plt"
> eval(paste0(var, "<-", 10))
[1] "plt<-10"
But instead, it returns a string.
I tried eval(as.expression(paste0(var, "<-", 10)))
and other options, but it still doesn't give the expected result.
What's wrong with the code?
回答1:
If I understand your comment correctly there is no reason to dive into the shark-infested waters of eval(parse())
. Try something like this instead:
myfun <- function(x, fun) {
if (is.character(fun)) fun <- match.fun(fun)
fun(x)
}
myfun(1:5, mean)
#[1] 3
myfun(1:5, "mean")
#[1] 3
回答2:
See: ?parse
. Your demo code:
> var = "plt"
> eval(parse(text = paste0(var, "<-", 10)))
> plt
[1] 10
Update: based on @Anton's comment about the original goal - what about:
> f <- function(type, ...) {
+ assign('plt', do.call(deparse(substitute(type)), list(...)), envir = .GlobalEnv)
+ }
> f(mean, x = 1:20)
> plt
[1] 10.5
PS: I still trying to implement what the OP is after, not what he might or should be after -- that's why I used above assign
and .GlobalEnv
, although it's not a great idea BTW.
来源:https://stackoverflow.com/questions/20581757/how-to-evaluate-an-expression-with-variables-in-r