2012-07-02 14 views
17

Próbuję użyć następującej składni, aby uzyskać informacje o zawodzie na stronie wikipedii George'a Clooneya. W końcu chciałabym, żeby istniała pętla, by uzyskać dane na temat różnych zawodów osobowości.Argument ma długość zero

Jednak pojawia się następujący problem z uruchomieniem poniższy kod:

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

Nie jestem pewien, dlaczego ten utrzymuje się na wymyślanie.

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

Porada debugowania: http://stackoverflow.com/a/5156351/636656. W szczególności wypróbuj 'options (error = recover)' here. –

+1

Problem jest najprawdopodobniej taki, że 'symbol' to' NULL'. Zobacz, co stanie się z 'if (NULL! =" Role ") print ('test')'. Coś takiego powinno zadziałać, chociaż nie uruchomiłem twojego kodu: 'if (! Is.null (symbol) && symbol! = 'Rola') symbol <- NULL' – GSee

+0

Użyj' col.names = moje_kolumnowe_ nazwy' w kable () z 'my_column_names' będącym wektorem znaków twoich poszukiwanych nazw, dla mnie działało! –

Odpowiedz

29

Jak @gsee wspomniano, trzeba sprawdzić, czy symbol nie NULL to przed sprawdzeniem jego wartość. Oto drobna aktualizacja twojego kodu, który działa (przynajmniej dla George'a).

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

Jeśli odpowiedź rozwiązała problem, kliknij zaznaczenie po lewej stronie, aby wybrać ją jako rozwiązanie. –

0

Stosować col.names = my_column_names w Kable() z my_column_names będąc charakter wektora poszukiwanego nazwiska, dla mnie to działa! - Benjamin Telkamp

Powiązane problemy