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