Actualizare r2lambda pentru a susține proiecte cu mai multe fișiere și proiecte renv

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(Acest articol a fost publicat pentru prima dată pe R | Discindoși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)


Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.

Implementați un proiect cu mai multe scripturi R și {renv}-mediu gestionat la AWS Lambda

Ambele caracteristici au necesitat ajustări minore ale bazei de cod. Copierea suplimentară acceptă scripturi și restaurarea {renv} ambele ar trebui să se întâmple atunci când imaginea docker AWS Lambda este creată, astfel încât logica pentru a crea fișierul Docker trebuia actualizată. În consecință, cel r2lambda::build_lambda
funcția are acum două argumente suplimentare:

#' @param support_path path to the support files (if any). Either NULL
#' (the default) if all needed code is in the same `runtime_path` script, or a
#' character vector of paths to additional files needed by the runtime script.
#' @param renvlock_path path to the renv.lock file (if any). Default is NULL.
#'
#' @details Use either `renvlock_path` or `dependencies` to install required
#' packages, not both. By default, both are `NULL`, so the Docker image will
#' have no additional packages installed.

Pentru a include orice scripturi de suport, furnizați căi de script cu vector de caractere către support_path argument la construirea locală a imaginii docker Lambda cu
build_lamdba.

(Rețineți că proiectul cu mai multe fișiere a fost acceptat și anterior, deși poate nu în mod explicit. O abordare care îmi place este de a crea un pachet „R” care exportă funcția de rulare necesară pentru Lambda. Apoi trebuie doar să faceți acea personalizare. R ambalați o dependență a proiectului și fie instalați în imaginea docker AWS Lambda dependencies sau
renvlock_path.)

Cod demo

Presupunând că avem un folder cu următoarea structură:

~/Desktop$ ls -1 iris-lambda/
renv/
renv.lock
runtime.r
support.r
test-code.r

Unde, support.r defineşte o funcţie care runtime.r utilizări pentru Lambda:

get_iris_summary_by_species <- function(species) {
iris |>
dplyr::filter(Species == species) |>
dplyr::summarise(
mean = mean(Sepal.Length),
sd = sd(Sepal.Length)
)
}

Apoi runtime.rgenerează scriptul de asistență și apelează funcția definită acolo:

source("support.r")
iris_summary <- function(species) {
get_iris_summary_by_species(species)
}
lambdr::start_lambda()

Apoi ar trebui să funcționeze următoarele, trecând scriptul de asistență și renv.lock la r2lambda::build_lambda:

dir("~/Desktop/iris-lambda")
runtime_function <- "iris_summary"
runtime_path <- "~/Desktop/iris-lambda/runtime.r"
support_path <- "~/Desktop/iris-lambda/support.r"
renvlock_path <- "~/Desktop/iris-lambda/renv.lock"
dependencies <- NULL
# Might take a while, its building a docker image
build_lambda(
tag = "my_iris_lambda",
runtime_function = runtime_function,
runtime_path = runtime_path,
support_path = support_path,
renvlock_path = renvlock_path,
dependencies = dependencies
)
# test
payload <- list(species = "setosa")
tag <- "my_iris_lambda"
test_lambda(tag = tag, payload)
# deploy
# Might take a while, its pushing it to a remote repository
deploy_lambda(
tag = "my_iris_lambda",
Timeout = 30
)
invoke_lambda(
function_name = "my_iris_lambda",
invocation_type = "RequestResponse",
payload = list(species = "versicolor"),
include_logs = FALSE
)
invoke_lambda(
function_name = "my_iris_lambda",
invocation_type = "RequestResponse",
payload = list(species = "setosa"),
include_logs = FALSE
)

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.