Jak zdalnie wywołać funkcję?
W pakiecie opencpu
operacja GET służy do pobierania danych.
Aby wywołać zdalnie funkcję należy wykorzystać operację POST.
Można to zrobić z użyciem funkcji httr::POST
. Argumenty zdalnego wywołania można podać jako listę, przekazując ją przez argument body
.
Przyjrzyjmy się przykładowemu wywołaniu. Uruchomimy zdalnie funkcję rnorm
z jednym argumentem n = 5
. Wynik zostanie zapisany do katalogu dostępnego pod uchwytem /ocpu/tmp/x009700e95f
.
(tmp <- httr::POST("http://localhost:4348/ocpu/library/stats/R/rnorm",
body = list(n = "5")))
Response [http://localhost:4348/ocpu/library/stats/R/rnorm]
Date: 2016-05-06 17:39
Status: 201
Content-Type: text/plain; charset=utf-8
Size: 184 B
/ocpu/tmp/x009700e95f/R/.val
/ocpu/tmp/x009700e95f/stdout
/ocpu/tmp/x009700e95f/source
/ocpu/tmp/x009700e95f/console
/ocpu/tmp/x009700e95f/info
/ocpu/tmp/x009700e95f/files/DESCRIPTION
Po zdalnym wywołaniu funkcji na serwerze powstaje zapis sesji z wynikami przetwarzania. Taką sesję można odpytywać. Np. aby odczytać listę obiektów R w sesji można sięgnąć do uchwytu http://localhost:4348/ocpu/tmp/x009700e95f/R/
.
Możemy te wyniki odczytać w R na wiele sposobów. Przedstawmy trzy najprostsze. Sięgniemy do ocpu/tmp/x009700e95f/R/.val
odczytując ten obiekt jako plik rda, csv czy plik R.
- odczytywanie wyników przez parsowanie funkcji
print()
(tmp <- httr::GET("http://localhost:4348/ocpu/tmp/x009700e95f/R"))
rawToChar(tmp$content)
[1] "[1] -0.1798980 1.3466641 1.1543092 0.2607556 -0.3512327\n"
- odczytywanie wyników w formacie rda przez funkcję
load()
(load(url("http://localhost:4348/ocpu/tmp/x009700e95f/R/.val/rda")))
.val
[1] -0.1798980 1.3466641 1.1543092 0.2607556 -0.3512327
- odczytywanie wyników w formacie csv z użyciem funkcji
readLines()
readLines(url("http://localhost:4348/ocpu/tmp/x009700e95f/R/.val/csv"))
[1] "\"x\"" "-0.179898029143394" "1.34666410945253"
[4] "1.15430921232522" "0.260755573763041" "-0.351232739954579"
Jak przekazywać dodatkowe argumenty do funkcji?
Wywołując zdalnie funkcje możemy wskazać jako parametr wartość, wyrażenie R lub wynik z innego wyrażenia, które było poprzednio policzone.
Poniżej przedstawiamy przykład dla każdej z tych możliwości.
# argumenty przekazane jako wartości
httr::POST("http://localhost:4348/ocpu/library/stats/R/rpois",
body = list(n = "1", lambda= "10"))
# przekazanie kodu R jako argumentu
httr::POST("http://localhost:4348/ocpu/library/stats/R/rexp",
body = list(n = "sqrt(9)", rate= "1"))
# przekazanie wyników jednej funkcji jako argumentu do drugiej
httr::POST("http://localhost:4348/ocpu/library/stats/R/rexp",
body = list(n = "x01bbf1e095", rate= "1"))