2012-07-02 19 views
17

Estoy tratando de usar la siguiente sintaxis para obtener la información de ocupación de la página de Wikipedia de George Clooney. Eventualmente me gustaría que haya un ciclo para obtener datos sobre las ocupaciones de varias personalidades.La discusión es de longitud cero

Sin embargo, me sale el siguiente problema al ejecutar el código de abajo:

Error in if (symbol != "role") symbol = NULL : argument is of length zero 

No estoy seguro de por qué esto sigue llegando hacia arriba.

library(XML) 
library(plyr) 
    url = 'http://en.wikipedia.org/wiki/George_Clooney' 

# don't forget to parse the HTML, doh! 
    doc = htmlParse(url) 

# get every link in a table cell: 
    links = getNodeSet(doc, '//table/tr/td') 

# make a data.frame for each node with non-blank text, link, and 'title' attribute: 
    df = ldply(links, function(x) { 
       text = xmlValue(x) 
      if (text=='') text=NULL 
     symbol = xmlGetAttr(x, 'class') 
     if (symbol!='role') symbol=NULL 
     if(!is.null(text) & !is.null(symbol)) 
       data.frame(symbol, text)   }) 
+3

Consejo de depuración: http://stackoverflow.com/a/5156351/636656. Específicamente, pruebe 'options (error = recover)' aquí. –

+1

es muy probable que 'symbol' sea' NULL'. Vea lo que sucede con 'if (NULL! =" Role ") print ('test')'. Algo así debería funcionar, aunque no ejecuté tu código: 'if (! Is.null (symbol) && symbol! = 'Role') symbol <- NULL' – GSee

+0

Usa' col.names = my_column_names' en kable () con 'my_column_names' siendo el vector de caracteres de tus nombres deseados, ¡para mí funcionó! –

Respuesta

29

Como @gsee mencionado, es necesario comprobar que no symbolNULL es antes de comprobar su valor. Aquí hay una actualización menor de tu código que funciona (al menos para George).

df = ldply(
    links, 
    function(x) 
    { 
    text = xmlValue(x) 
    if (!nzchar(text)) text = NULL 
    symbol = xmlGetAttr(x, 'class') 
    if (!is.null(symbol) && symbol != 'role') symbol = NULL 
    if(!is.null(text) & !is.null(symbol)) 
     data.frame(symbol, text)   
    } 
) 
+0

Si la respuesta resolvió su problema, haga clic en la marca de la izquierda para seleccionarla como solución. –

0

Use col.names = my_column_names en Kable() con my_column_names siendo vectorial carácter de sus nombres buscados, para mí funcionó! - Benjamin Telkamp

Cuestiones relacionadas