funciones - Devolución de objetos múltiples en una función R
funciones r en r ejemplos (6)
Esta pregunta ya tiene una respuesta aquí:
¿Cómo puedo devolver múltiples objetos en una función R? En Java, haría una clase, tal vez una Person
que tiene algunas variables privadas y encapsula, tal vez, height
, age
, etc.
Pero en R, necesito pasar alrededor de grupos de datos. Por ejemplo, ¿cómo puedo hacer que una función R devuelva una lista de caracteres y un número entero?
A diferencia de muchos otros lenguajes, las funciones R no devuelven múltiples objetos en el sentido estricto. La forma más general de manejar esto es devolver un objeto de list
. Entonces, si tiene un entero foo
y un vector de bar
de cadenas en su función, puede crear una lista que combine estos elementos:
foo <- 12
bar <- c("a", "b", "e")
newList <- list("integer" = foo, "names" = bar)
Luego return
esta lista.
Después de llamar a su función, puede acceder a cada uno de estos con newList$integer
o newList$names
.
Es posible que otros tipos de objetos funcionen mejor para diversos fines, pero el objeto de la list
es una buena forma de comenzar.
Del mismo modo en Java, puede crear una clase S4 en R que encapsula su información:
setClass(Class="Person",
representation(
height="numeric",
age="numeric"
)
)
Entonces su función puede devolver una instancia de esta clase:
myFunction = function(age=28, height=176){
return(new("Person",
age=age,
height=height))
}
y puede acceder a su información:
aPerson = myFunction()
aPerson@age
aPerson@height
Es algo en esta línea lo que estás buscando?
x1 = function(x){
mu = mean(x)
l1 = list(s1=table(x),std=sd(x))
return(list(l1,mu))
}
library(Ecdat)
data(Fair)
x1(Fair$age)
Podría usar for()
con assign()
para crear muchos objetos. Vea el ejemplo de assign()
:
for(i in 1:6) { #-- Create objects ''r.1'', ''r.2'', ... ''r.6'' --
nam <- paste("r", i, sep = ".")
assign(nam, 1:i)
Mirando los nuevos objetos
ls(pattern = "^r..$")
También puedes usar la súper asignación.
En lugar de "<-" escriba "<< -". La función buscará recursiva y repetidamente un nivel funcional más alto para un objeto de ese nombre. Si no puede encontrar uno, creará uno en el nivel global.
Una forma de manejar esto es colocar la información como un atributo en la primaria. Debo enfatizar, realmente creo que esto es lo apropiado para hacer solo cuando las dos piezas de información están relacionadas de tal manera que uno tiene información sobre el otro.
Por ejemplo, a veces oculto el nombre de "variables cruciales" o variables que se han modificado significativamente almacenando una lista de nombres de variables como un atributo en el marco de datos:
attr(my.DF, ''Modified.Variables'') <- DVs.For.Analysis$Names.of.Modified.Vars
return(my.DF)
Esto me permite almacenar una lista de nombres de variables con el propio marco de datos.