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
Ответы
Ответ 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?