2013-12-14 5 views
1

Я ожидаю, что этот код, чтобы установить plt равным 10:Как оценить выражение с переменными в R?

> var = "plt" 
> eval(paste0(var, "<-", 10)) 
[1] "plt<-10" 

Но вместо этого, он возвращает строку.

Я пробовал eval(as.expression(paste0(var, "<-", 10))) и другие варианты, но он все еще не дает ожидаемого результата.

Что не так с кодом?

+4

Если ответ разобран(), вы должны, как правило, переосмыслить вопрос. - Thomas Lumley R-help (февраль 2005) –

+0

Что вы на самом деле пытаетесь сделать? – Thomas

+0

@Thomas Чтобы выполнить функцию, имя которой передается другой функции в качестве аргумента. Подобно 'function (type, ...) eval (parse (text = paste0 (" plt <- ", type," (...) "'. –

ответ

8

Если я правильно понимаю ваш комментарий, нет никаких оснований погружаться в затопленные акулой воды eval(parse()). Попробуйте что-то вроде этого:

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

См. ?parse. Ваш демо-код:

> var = "plt" 
> eval(parse(text = paste0(var, "<-", 10))) 
> plt 
[1] 10 

Update: на основе @ Антона комментарий о первоначальной цели - что о:

> f <- function(type, ...) { 
+  assign('plt', do.call(deparse(substitute(type)), list(...)), envir = .GlobalEnv) 
+ } 
> f(mean, x = 1:20) 
> plt 
[1] 10.5 

PS: Я все еще пытаюсь реализовать то, что ОП после , не то, что он мог или должен был после этого - вот почему я использовал выше assign и .GlobalEnv, хотя это не отличная идея BTW.

+4

@Anton Серьезно, не используйте это. Это приведет к очень плохому коду качество (трудно понять и поддерживать). Всегда есть лучшие альтернативы 'eval (parse())'. – Roland

Смежные вопросы