2016-02-11 6 views
10

Funkcja html_nodes() kończy się niepowodzeniem w następujący sposób po uruchomieniu jako wykonywalny RScript, ale powiedzie się, gdy uruchomi się interaktywnie. Czy ktoś wie, co może być innego w biegach?rvest, html_nodes() błąd: nie można przymusić typu 'environment' do wektora typu 'list'. Fails RScript, działa w sesji

Uruchomienie interaktywne zostało uruchomione z nową sesją, a instrukcja źródłowa była pierwszym uruchomieniem.

$ ./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 

Mimo to udaje, gdy uruchamiane jako source() Interaktywnie:

> 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 

Dziękuję Matt

+0

Nie używałem rvest, ale doświadczył podobnych problemów wielokrotnie z 'RSelenium'. Prawdopodobnie przerwie to orurowanie, ale możesz chcieć odkryć za pomocą 'Sys.sleep (5)'. Co jakiś czas musiałem przejść do 'Sys.sleep (15)', a nawet 20, aby umożliwić załadowanie strony. – PavoDive

+4

Spróbuj dodać 'library (methods)' na początku skryptu – hadley

+1

@hadley: dodanie 'biblioteki (metody)' zadziałało. Zgodziłbym się, gdyby to było rozwiązanie. I dziękuję. – mpettis

Odpowiedz

6

Dodanie wiersz:

library(methods) 

Per komentarza do pierwotnego pytania przez Hadley Wickham nie rozwiązać ten błąd. Dlaczego rozwiązał ten błąd, nie wiem. Ale publikuję odpowiedź, więc istnieje tutaj łatwo dostępne rozwiązanie. Jeśli , dlaczego to rozwiązuje problem jest wysłana, przyjmuję tę odpowiedź.

Dodajesz komentarz od dołu z @ Mekki-Macaulay na tekst tutaj, bo to naprawdę dodaje trochę jasności:

This thread might shed some light on it. It seems that in some contexts RSCRIPT doesn't load package::methods by default, whereas interactive sessions do load it by default. It seems that the "when" is not clear, but explicitly calling library(methods) for all RSCRIPT executions seems to be the safe bet: can use package interactively, but Rscript gives errors

+0

Byłbym bardzo ciekawy, aby dowiedzieć się, dlaczego. –

+1

Ten wątek może rzucić trochę światła na to. Wydaje się, że w niektórych kontekstach 'RSCRIPT' nie ładuje domyślnie' package :: methods', podczas gdy sesje interaktywne ładują je domyślnie. Wygląda na to, że "kiedy" nie jest jasne, ale jawne wywoływanie 'biblioteki (metod)' dla wszystkich 'RSCRIPT' jest bezpiecznym rozwiązaniem: http://stackoverflow.com/questions/19780515/can-use-package -interactively-but-rscript-gives-errors –

+0

To naprawdę dobrze wiedzieć, dziękuję! – mpettis

-1

To prawdopodobnie efekt uboczny tego, jak magrittr::%>% prac operatorskich. Od Magrittr Documentation - Page 8: %>% Pipe:

The magrittr pipe operators use non-standard evaluation. They capture their inputs and examines them to figure out how to proceed. First a function is produced from all of the individual right-hand side expressions, and then the result is obtained by applying this function to the left-hand side. For most purposes, one can disregard the subtle aspects of magrittr's evaluation, but some functions may capture their calling environment, and thus using the operators will not be exactly equivalent to the "standard call" without pipe-operators (Emphasis mine).

jako takie, spróbuj go bez %>% aby zobaczyć, czy to dlatego, że html_nodes jest nieprawidłowo uchwycenie środowiska z wiersza poleceń (jak sugeruje Twój komunikat o błędzie), natomiast w sesji interaktywnej, może chwycić środowiska sesji sesji:

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

Czy to zadziała, gdy zostanie wywołane jako plik wykonywalny RScript?

+0

To nie działa, a ja otrzymuję ten sam błąd w wywołaniu 'html_nodes()'. Dziękuję za pomysł. – mpettis

+0

Czy dodanie '--vanilla' do wywołania linii komend zmienia coś? –

+0

Nie, używając '--vanilla' nadal otrzymuję ten sam błąd. Nazwany jako: '$ RScript --vanilla test-pdp.R' – mpettis

Powiązane problemy