2016-02-11 8 views
10

Die Funktion html_nodes() schlägt wie folgt fehl, wenn sie als ausführbares RScript ausgeführt wird, ist aber erfolgreich, wenn sie interaktiv ausgeführt wird. Weiß jemand, was in den Läufen anders sein könnte?rvest, html_nodes() error: kann den Typ 'environment' nicht in einen Vektor des Typs 'list' einbinden. Fehler in RScript, funktioniert in Sitzung

Der interaktive Lauf wurde mit einer neuen Sitzung ausgeführt und die Quellanweisung war der erste Lauf.

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

Doch gelingt es, wenn als source() interaktiv ausführen:

> 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 

Danke, Matt

+0

Ich habe rvest nicht verwendet, aber haben ähnliche Probleme oft erlebt mit 'RSelenium'. Es wird wahrscheinlich die Rohrleitung durchbrechen, aber Sie möchten vielleicht mit 'Sys.sleep (5)' erkunden. Ocassionally musste ich zu 'Sys.sleep (15)' gehen und sogar 20, um die Seite zu erlauben zu laden. – PavoDive

+4

Versuchen Sie 'library (methods)' am Anfang Ihres Skripts hinzuzufügen. – hadley

+1

@hadley: Hinzufügen von 'library (Methoden)' hat funktioniert. Ich würde es akzeptieren, wenn es eine Lösung wäre. Und danke dir. – mpettis

Antwort

6

Hinzufügen der Zeile:

library(methods) 

Per den Kommentar auf die ursprüngliche Frage von Hadley Wickham diesen Fehler tat lösen. Warum es den Fehler gelöst hat, weiß ich nicht. Aber ich schreibe eine Antwort, so dass es hier eine leicht referenzierbare Lösung gibt. Wenn warum dies löst das Problem wird geschrieben, werde ich diese Antwort akzeptieren.

Kommentar hinzufügen von unten von @ mekki-macaulay in Text hier, weil es wirklich etwas Klarheit fügt hinzu:

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

Ich wäre sehr neugierig zu erfahren warum. –

+1

Dieser Thread könnte etwas Licht darauf werfen. Es scheint, dass 'RSCRIPT' in einigen Kontexten' package :: methods' nicht standardmäßig lädt, während interaktive Sitzungen es standardmäßig laden. Es scheint, dass das "wenn" nicht klar ist, aber "library (methods)" für alle "RSCRIPT" Ausführungen explizit aufzurufen: http://stackoverflow.com/questions/19780515/can-use-package -interaktiv-aber-rscript-gibt-Fehler –

+0

Das ist wirklich gut zu wissen, danke! – mpettis

-1

Es ist wahrscheinlich eine Nebenwirkung wie die magrittr::%>% Operator funktioniert. Von 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).

Als solches versuchen, es ohne %>% zu sehen, ob es ist, weil html_nodes falsch ist die Umgebung, in der Befehlszeile erfassen (wie Ihre Fehlermeldung deutet darauf hin), während in der interaktiven Sitzung, kann es greift die Sitzungsumgebung varaibles:

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

Funktioniert das, wenn es als ausführbares RScript aufgerufen wird?

+0

Es funktioniert nicht, und ich bekomme den gleichen Fehler beim Aufruf 'html_nodes()'. Danke für die Idee. – mpettis

+0

Ändert das Hinzufügen von '--vanilla' zum Kommandozeilen-Aufruf irgendetwas? –

+0

Nein, mit '--vanilla' bekomme ich immer noch den gleichen Fehler. Genannt als: '$ RScript --vanilla test-pdp.R' – mpettis