Проблема печати дерева регрессии, «Ошибка в cat (x, …, sep = sep): аргумент 1 (тип ‘список’) не может быть обработан ‘cat'»

#r #decision-tree

#r #дерево решений

Вопрос:

Я пытаюсь построить дерево на основе некоторых данных о раке предстательной железы.

 > head(prostate)
# A tibble: 6 x 6
  lcavol   age  lbph   lcp gleason   lpsa
   <dbl> <dbl> <dbl> <dbl>   <dbl>  <dbl>
1 -0.580    50 -1.39 -1.39       6 -0.431
2 -0.994    58 -1.39 -1.39       6 -0.163
3 -0.511    74 -1.39 -1.39       7 -0.163
4 -1.20     58 -1.39 -1.39       6 -0.163
5  0.751    62 -1.39 -1.39       6  0.372
6 -1.05     50 -1.39 -1.39       6  0.765
  

Я объявил все необходимые пакеты и начал строить свое дерево.

 > library(tree)
> pstree <- tree(lcavol ~., data=prostate, mindev=0.1, mincut=1)
> pstree <- tree(lcavol ~., data=prostate, mincut=1)
  

Команды выполняются без проблем. Однако, когда я пытаюсь распечатать свое дерево, я сталкиваюсь с ошибкой.

 > pstree
Error in cat(x, ..., sep = sep) : 
  argument 1 (type 'list') cannot be handled by 'cat'
  

Когда я изучаю структуру ‘prostate’, она показывает, что это фрейм данных.

 > str(prostate)
tibble [97 x 6] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
  

Более странной частью может быть то, что когда я строю дерево, я получаю свои графики, как если бы работала предыдущая команда

 plot(pstree, col=8)
text(pstree, digits=2)
  

введите описание изображения здесь

Когда я загружал пакет ‘tree’, мне пришлось обновить свой R, поскольку я запускал более старую версию. Возможно, из-за этого я сталкиваюсь с ошибкой? Вот версия R, которую я запускаю

 > version
               _                           
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          4                           
minor          0.3                         
year           2020                        
month          10                          
day            10                          
svn rev        79318                       
language       R                           
version.string R version 4.0.3 (2020-10-10)
nickname       Bunny-Wunnies Freak Out 
  

Я понимаю, что cat является частью базового пакета, поэтому я не уверен, почему это может вызвать проблемы. Возможно, есть какой-то другой пакет, который был удален в обновлении, вызвавшем эту проблему? Я установил и загрузил пакет «Cat» в случае, но это не решило проблему.

Также обратите внимание, что этот код предназначен для класса интеллектуального анализа данных, который я в настоящее время использую. Код и сопроводительный текст взяты из книги Йоханнеса Ледолтера «Интеллектуальный анализ данных и бизнес-аналитика с R. Вы можете увидеть полный код для главы 13 здесь и данные здесь . Большое вам спасибо за ваше время, мысли и помощь!

Приветствия, Крис

Ответ №1:

Я столкнулся с той же проблемой и не нашел никакой другой поддержки для этого в Интернете. Я понял, что получаю эту ошибку, когда tidyverse tree оба пакета и загружаются одновременно. Выгрузка tidyverse решила проблему для меня.

Примечание: вот версии, которые я использую. Я убедился, что использую последние версии.

  • R Studio: 1.3.1093
  • R: 4.0.3 (2020-10-10)
  • tree пакет: 1.0.40
  • tidyverse пакет: 1.0.40

Комментарии:

1. Хорошо, спасибо! В итоге я использовал rpart пакет вместо этого и, честно говоря, предпочел его. Спасибо за комментарий, хотя!

Ответ №2:

У меня та же ошибка, что и у вас, при попытке вызвать функцию печати класса tree.

 >tree_OJ
Error in cat(x, ..., sep = sep) : 
  argument 1 (type 'list') cannot be handled by 'cat'
  

Ошибка вызвана загрузкой пакета «cli», который загружается неявно при загрузке «tidyverse». Пакет «cli» запутывает пространство имен и перезаписывает функцию печати для класса tree.

 Registered S3 method overwritten by 'cli':
  method     from
  print.tree tree
  

Если вам нужно использовать пакет «tidyverse»,
вы можете использовать следующий код, который явно вызывает функцию печати, используемую для класса tree. Не забудьте использовать «:::» вместо обычно используемого «::», потому что функция print.tree не является открытой функцией в пакете дерева.

 tree:::print.tree(tree_OJ)