2015-09-10 2 views
2

Я получаю Error: $ operator not defined for this S4 class, когда пытаюсь запустить ctree из party package, но только если формула написана как строка, которую я преобразовываю с помощью as.formula().R - as.formula() не работает с ctree {party}?

Ниже приведен пример:

#This works fine : 
y <- ctree(formula = quotation ~ minute + temp, data=test[[1]], controls = ctree_control(mincriterion = 0.99)) 

#While this doesn't : 
x <- "ctree(formula = quotation ~ minute + temp, data=test[[1]], controls = ctree_control(mincriterion = 0.99))" 

y <- as.formula(x) 
Error: $ operator not defined for this S4 class 

Моя конечная цель состоит в том, чтобы создать функцию, которая перебирает список test создать несколько деревьев.

Любая идея?

+1

Параметр 'as.formula' относится только к формуле части. Таким образом, это должно быть 'x <- as.formula (quotation ~ minute + temp)'; и строка после 'y <- ctree (formula = x, ...)'. Например, если я использую набор данных iris, это будет: 'x1 <- as.formula (Species ~ Petal.Length + Petal.Width); y1 <- ctree (formula = x1, data = iris)' – chappers

+0

Спасибо за ваш ответ, но как 'ctree' рассматривается, если не как формула? Мне нужно выполнить итерацию за пределами того, что вы описали как x. –

+0

Я бы порекомендовал вам проверить пакет 'caret'. Он имеет функцию «train» с аргументом 'tuneGrid', который звучит так, как вы. – chappers

ответ

1

ctree - это функция, а не формула. formula - это класс объекта, являющийся результатом функции '~' (тильда). Вы можете узнать больше о формулах от help('~') и help('formula').

Наиболее распространенный способ использования as.formula - преобразовать строку, которая представляет синтаксис формулы для объекта формулы класса. Что-то вроде as.formula('y ~ x'). Также проверьте class(as.formula(y~x)).

В вашем случае вы сохранили строку, представляющую функцию ctree, переменной x. Функция ctree содержит только строку, представляющую синтаксис формулы (quotation ~ minute + temp), но она не может быть принудительно применена к формуле (она не представляет собой формулу, она просто содержит строку синтаксиса формулы), потому что она не соответствует синтаксису формулы.

Если вы хотите выполнить функцию из текста, необходимо использовать eval(parse(text = x)) хотя этот метод не рекомендуется ..

+0

Это отлично работает! Могу ли я спросить, почему это не рекомендуется? –

+1

@YohanObadia. Добро пожаловать. Рад, что я могу помочь. Несомненно, три основные причины: 1. Он намного медленнее, чем запуск фактической команды. 2. Это значительно усложняет чтение кода и 3. Это общий источник ошибок, когда вы используете его в пакете как во многих случаях люди могут ошибаться в струне. Существует обсуждение этого вопроса (здесь http://stackoverflow.com/questions/13649979/what-specifically-are-the-dangers-of-evalparse), если вы хотите посмотреть. Лично я больше согласен со вторым наиболее уместным ответом. – LyzandeR

+0

Ссылка была интересна. Отсутствие знаний R - это то, с чем я столкнулся сейчас, а помимо eval (parse()) я не вижу никакого способа делать то, что хочу сейчас. –

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