Определение кривой() строкой

Доброе утро,

Я застрял с преобразованием типов между строками и выражениями в R. Я хочу построить кривую (используя функцию curve()) с уравнением, определяемым строкой следующим образом:

curve(x^3)
## Ok, generates a curve as expected

qq<-"x^3"
curve(qq)
Error in UseMethod("qq") : 
no applicable method for 'qq' applied to an object of class "c('double', 'numeric')"

Я могу это понять, первый аргумент должен быть выражением.

curve(expr=expression(qq))
Error in curve(expr = expression(qq)) : 
  'expr' must be a function, or a call or an expression containing 'x'

Этого я не могу понять: мое понимание выражения () от человека заключается в том, что «... выражение возвращает вектор типа «выражение», содержащий его аргументы (неоцененные)».

Итак, что я должен сделать, чтобы построить кривую с уравнением, определяемым содержимым строки qq?

Спасибо

JF


person jfmoyen    schedule 14.05.2014    source источник


Ответы (1)


curve заменяет выражение в самом начале:

substitute(expression(qq))
#expression(qq)

Из этого он не может сделать вывод, что ему нужно:

all.vars(substitute(expression(qq)))
#[1] "qq"

all.vars(substitute(x^3))
#[1] "x"

Я думаю, вам нужен ужасный eval(parse()):

x <- 1:10
qq <- "x^3"
ff <- as.function(alist(x=, eval(parse(text=qq))))
curve(ff)

Редактировать (2020-09-21):

Более чем через 6 лет я бы сделал это по-другому. Мне не нравится eval(parse())ing qq здесь, потому что это создает ненужную угрозу безопасности. Вместо этого я подставлю его в вызов и оценю вызов curve.

qq <- parse(text = qq)[[1]]
eval(substitute(curve(qq), list(qq = qq)))
person Roland    schedule 14.05.2014
comment
Действительно, ваше решение работает (спасибо!). Хотя я до сих пор не уверен, что понимаю почему. Здесь вы конвертируете строку в функцию и используете возможности curve() для работы с функциями. В этом нет ничего плохого, но почему вы не можете сгенерировать выражение из строки qq и использовать его прямо в кривой()? Я не против eval(parse()), но почему curve(expr=eval(parse(text=qq))) или curve(expr=parse(text=qq)) не работают? - person jfmoyen; 14.05.2014
comment
Прочитайте первое предложение моего ответа. - person Roland; 14.05.2014
comment
(+1) за понимание curve документации - person David Arenburg; 14.05.2014