tablas studio recodificar que programacion funciones faltantes ejemplos disponibles datos con bases analisis r function partial-application

studio - ¿Cómo aplicar de manera eficiente una función en R?



tablas en r (3)

Hay funciones en el paquete pryr que pueden manejar esto, a saber, partial()

f <- function(a, b, c, d) a + b + c + d pryr::partial(f, a = 1, c = 2) # function (...) # f(a = 1, c = 2, ...)

Así que puedes usarlo así.

new_fun <- pryr::partial(f, a = 1, c = 2) new_fun(b = 2, d = 5) # [1] 10 ## or if you are daring ... new_fun(2, 5) # [1] 10

También puedes simplemente cambiar los argumentos formales de f() con

f <- function(a, b, c, d) a + b + c + d formals(f)[c("a", "c")] <- list(1, 2) f # function (a = 1, b, c = 2, d) # a + b + c + d f(b = 2, d = 5) # [1] 10

Pero con este último, debe nombrar los argumentos d en f() para evitar un error cuando desee dejar a c como sus valores predeterminados.

Supongamos que tengo una función en R que toma múltiples argumentos, y me gustaría reducirla a una función de menos argumentos estableciendo algunos de los argumentos a valores preespecificados. Estoy tratando de averiguar cuál es la mejor manera de hacerlo en R.

Por ejemplo, supongamos que tengo una función

f <- function(a,b,c,d){a+b+c+d}

Me gustaría crear o encontrar una función parcial que haría lo siguiente

partial <- function(f, ...){ #fill in code here } new_f <- partial(f, a=1, c= 2)

new_f sería una función de d y devolvería 1+b+2+d

En python lo haria

from functools import partial def f(a,b,c,d): return a+b+c+d new_f = partial(f, a=1, c= 2)

De hecho, estoy haciendo esto repetidamente, por lo que necesito que esto sea lo más eficiente posible. ¿Alguien puede indicarme la manera más eficiente de hacer esto? Ahora lo mejor que puedo hacer es

partial <- function(f, ...){ z <- list(...) formals(f) [names(z)] <- z f }

¿Alguien puede hacerme saber de una manera más rápida o la mejor manera de hacer esto? Esto es simplemente demasiado lento.


Puedes rodar tu propio sin demasiada codificación usando do.call :

partial <- function(f, ...) { l <- list(...) function(...) { do.call(f, c(l, list(...))) } }

Básicamente, partial devuelve una función que almacena f , así como los argumentos proporcionados originalmente (almacenados en la lista l ). Cuando se llama a esta función, se pasa tanto los argumentos en l como cualquier otro argumento adicional. Aquí está en acción:

f <- function(a, b, c, d) a+b+c+d p <- partial(f, a=2, c=3) p(b=0, d=1) # [1] 6


También tienes Curry del paquete functional :

library(functional) f <- function(a, b, c, d) a+b+c+d ff = Curry(f, a=2, c=10) ff(1,5) #[1] 18 ff(b=1,d=5) #[1] 18