Подтвердить что ты не робот

Rvest, html_nodes() error: не может принуждать тип 'environment' к вектору типа 'list'. Сбой RScript, работает в сеансе

Функция html_nodes() не работает следующим образом при запуске как исполняемый RScript, но успешно выполняется при интерактивном запуске. Кто-нибудь знает, что может быть другим в прогонах?

Интерактивный запуск выполнялся со свежим сеансом, а исходный оператор был первым.

$ ./test-pdp.R
>
> ################################################################################
> # Setup
> ################################################################################
> suppressPackageStartupMessages(library(plyr))
> suppressPackageStartupMessages(library(dplyr))
> suppressPackageStartupMessages(library(stringr))
> suppressPackageStartupMessages(library(rvest))
> suppressPackageStartupMessages(library(httr))
>
>
> read_html("http://google.com") %>%
+     html_nodes("div") %>%
+     length()
Error in as.vector(x, "list") :
  cannot coerce type 'environment' to vector of type 'list'
Calls: %>% ... <Anonymous> -> lapply -> as.list -> as.list.default
Execution halted

Тем не менее он успешно выполняется при source() в интерактивном режиме:

> source("/Users/a6001389/Documents/projects/hottest-deals-page-scrape/src/test-pdp.R", echo=TRUE)
> #!/usr/bin/RScript
> options(echo=TRUE)
> ################################################################################
> # Setup
> ####################################################### .... [TRUNCATED] 
> suppressPackageStartupMessages(library(dplyr))
> suppressPackageStartupMessages(library(stringr))
> suppressPackageStartupMessages(library(rvest))
> suppressPackageStartupMessages(library(httr))
> read_html("http://google.com") %>%
+     html_nodes("div") %>%
+     length()
[1] 17

Спасибо, Matt

4b9b3361

Ответ 1

Добавление строки:

library(methods)

В комментарии к оригинальному вопросу Хэдли Уикхем решила эту ошибку. Почему он решил ошибку, я не знаю. Но я отправляю ответ, поэтому здесь легко найти решение. Если почему это решает проблему, опубликовано, я приму этот ответ.

Добавление комментария ниже от @mekki-macaulay в текст здесь, потому что это действительно добавляет некоторую ясность:

Этот поток может пролить свет на него. Похоже, что в некоторых контекстах RSCRIPT по умолчанию не загружает методы package::, тогда как интерактивные сеансы действительно загружают его по умолчанию. Кажется, что "когда" непонятно, но явно вызов библиотеки (методов) для всех исполнений RSCRIPT кажется безопасной: может использовать пакет в интерактивном режиме, но Rscript дает ошибки

Ответ 2

Вероятно, это побочный эффект работы оператора magrittr::%>%. Из Документация Magrittr - Страница 8:% > % Pipe:

Операторы труб Magrittr используют нестандартную оценку. Они захватывают свои материалы и анализируют их, чтобы выяснить, как действовать. Сначала создается функция из всех отдельных правых выражений, а затем результат получается, применяя эту функцию к левой части. Для большинства целей можно игнорировать тонкие аспекты оценки magrittr, , но некоторые функции могут захватывать свою вызывающую среду, и, следовательно, использование операторов не будет в точности эквивалентно "стандартным вызовам" без операторов-операторов (Акцент мой).

Как таковой, попробуйте без %>%, чтобы узнать, не вызвано ли это тем, что html_nodes неправильно отображает среду из командной строки (как подсказывает ваше сообщение об ошибке), тогда как в интерактивном сеансе она может захватывать переменные сеанса varaibles

google_node <- read_html("http://google.com");
div_nodes   <- html_nodes(google_node, "div");
length(div_nodes);

Это работает, когда вызывается как исполняемый RScript?