How to evaluate an expression with variables in R?

2019-07-31 22:50发布

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?

2条回答
小情绪 Triste *
2楼-- · 2019-07-31 23:35

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
查看更多
老娘就宠你
3楼-- · 2019-07-31 23:37

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.

查看更多
登录 后发表回答