2011-04-26 24 views
13

Jako sposób na zbadanie, w jaki sposób utworzyć pakiet w R dla Denver RUG, zdecydowałem, że byłoby zabawnym małym projektem napisanie wrapperu R wokół interfejsu API datasciencetoolkit. Podstawowe narzędzia R pochodzą z pakietu RCurl, jak można sobie wyobrazić. Utknąłem na pozornie prostym problemie i mam nadzieję, że ktoś na tym forum mógłby wskazać mi właściwy kierunek. Podstawowy problem polega na tym, że nie mogę użyć funkcji postForm() do przekazania nie-kluczowego ciągu jako części opcji danych w curl, tj. Curl -d "string" "address_to_api".Żądanie POST za pomocą RCurl

Na przykład z wiersza poleceń mogę zrobić

$ curl -d "Tim O'Reilly, Archbishop Huxley" "http://www.datasciencetoolkit.org/text2people" 

z sukcesem. Wydaje się jednak, że funkcja postForm() wymaga jawnego klucza podczas przekazywania dodatkowych argumentów do żądania POST. Przejrzałem kod datasciencetoolkit i dokumentację programisty pod kątem możliwego klucza, ale nie mogę niczego znaleźć.

Na marginesie bardzo proste jest przekazywanie danych wejściowych za pośrednictwem żądania GET do innych części interfejsu API DSTK. Na przykład:

ip2coordinates <- function(ip) { 
    api <- "http://www.datasciencetoolkit.org/ip2coordinates/" 
    result <- getURL(paste(api, URLencode(ip), sep="")) 
    names(result) <- "ip" 
    return(result) 
} 
ip2coordinates('67.169.73.113') 

da oczekiwane rezultaty.

Dla jasności, przeczytałem dokumenty RCurl na stronie omegahat DTL, dokumenty RCurl z pakietem i stronę podręcznika. Jednak brakuje mi czegoś podstawowego w odniesieniu do curl (lub być może .opts() w funkcji postForm()) i nie mogę tego uzyskać.

W python, mogłem zasadniczo zrobić "surowe" żądanie POST za pomocą httplib.HTTPConnection - jest coś takiego jak to dostępne w R? Spojrzałem również na funkcję simplePostToHost w pakiecie httpRequest i wydawało się, że blokuje ona moją sesję R (wydaje się, że wymaga ona również klucza).

FWIW, używam wersji 2.13.0 na komputerze Mac 10.6.7.

Każda pomoc jest doceniana. Cały kod wkrótce będzie dostępny na github, jeśli chcesz się bawić z zestawem narzędzi do nauki danych.

Pozdrawiam.

Odpowiedz

15

Z httr, to tylko:

library(httr) 
r <- POST("http://www.datasciencetoolkit.org/text2people", 
    body = "Tim O'Reilly, Archbishop Huxley") 
stop_for_status(r) 
content(r, "parsed", "application/json") 
6

Ogólnie rzecz biorąc, w tych przypadkach, w których próbujesz POST czegoś, co nie jest kluczowane, możesz po prostu przypisać fałszywy klucz do tej wartości. Na przykład:

> postForm("http://www.datasciencetoolkit.org/text2people", a="Archbishop Huxley") 
[1] "[{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":44,\"end_index\":61,\"matched_string\":\"Archbishop Huxley\"},{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":88,\"end_index\":105,\"matched_string\":\"Archbishop Huxley\"}]" 
attr(,"Content-Type") 
       charset 
"text/html"  "utf-8" 

będzie działać tak samo, gdybym wykorzystywane b = „abp Huxleya”, itp

Ciesz RCurl - to chyba mój ulubiony pakiet R. Jeśli zdobędziesz awanturę, uaktualnienie do wersji ~ libcurl 7.21 ujawnia kilka nowych metod za pomocą curl (w tym SMTP itp.).

+0

Dzięki za pomoc! Czy jest jakiś powód, że kluczem jest "a"? Próbowałem "imię", "tekst" i kilka innych bzdur. – rtelmore

+0

Korekta: próbowałem używać "name" itp. W innym wywołaniu. Próbowałem użyć, np. postForm (api, string) i potrzebujesz postForm (api, a = string). – rtelmore

+0

W prawo, musisz podać parę klucz = wartość. "a" było całkowicie arbitralne (to tylko pierwsza litera, która przyszła mi do głowy). Dowolny z tych innych działa równie dobrze (jak a = "string", name = "string", itp. "A" = "string" nie zadziała.) – Noah

1

Chciałem tylko wskazać, że musi istnieć problem z przekazywaniem nieprzetworzonego łańcucha za pomocą funkcji postForm. Na przykład, jeśli mogę użyć curl z linii poleceń, mam następujące:

$ curl -d "Archbishop Huxley" "http://www.datasciencetoolkit.org/text2people 
[{"gender":"u","first_name":"","title":"archbishop","surnames":"Huxley","start_index":0,"end_index":17,"matched_string":"Archbishop Huxley"}] 

aw RI dostać

> api <- "http://www.datasciencetoolkit.org/text2people" 
> postForm(api, a="Archbishop Huxley") 
[1] "[{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":44,\"end_index\":61,\"matched_string\":\"Archbishop Huxley\"},{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":88,\"end_index\":105,\"matched_string\":\"Archbishop Huxley\"}]" 
attr(,"Content-Type") 
       charset 
"text/html"  "utf-8" 

pamiętać, że zwraca dwa elementy w ciąg JSON i ani jeden mecz na the start_index lub end_ index. Czy to jest problem z kodowaniem lub czymś?

+0

Domyślam się, że jest to coś na końcu API - jest to typ rzeczy, o których można by się przekonać, gdyby dziwnie obchodziły się z zakodowanymi adresami URL. Możesz spróbować użyć metody URLencode() do argumentu, ale to może nie pomóc. – Noah

1

Funkcja simplePostToHost w pakiecie httpRequest może zrobić to, czego szukasz.

2

Od Duncan Temple Lang na liście R-help:

postForm() korzysta inny styl (lub konkretnie Content-Type) złożenia formularza niż curl polecenia -d. Przełączanie stylu = 'POST' używa tego samego typu, ale szybko się domyślić, nazwa parametru "a" powoduje zamieszanie , a wynikiem jest pusta tablica JSON - "[]".

Szybkie obejście jest użycie curlPerform() bezpośrednio zamiast postForm()

r = dynCurlReader() 
curlPerform(postfields = 'Archbishop Huxley', url = 'http://www.datasciencetoolkit.org/text2people', verbose = TRUE, 
      post = 1L, writefunction = r$update) 
r$value() 

Daje

[1] 
"[{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":0,\"end_index\":17,\"matched_string\":\"Archbishop 
Huxley\"}]" 

i można korzystać fromJSON(), aby przekształcić go w danych w R.

Powiązane problemy