forzar el tipo de datos de clase en R con as
Pregunta
Entiendo que en R tienes algunos tipos de datos base (vector, matrix, list, data.frame
) y luego en los paquetes R tienes algunos tipos avanzados llamados clase S3 o clase S4 (ppp
,owin
, spatialPointsDataFrame
y muchos otros.Algunas de las funciones de los paquetes de R solo funcionan con argumentos de tipo especial.
Necesito una explicación sobre la conversión entre diferentes clases y tipos de datos en R:
A veces puedo usar un código como:
m = c(1, 2, 3, 4)
df = as.data.frame(m)
Pero en otros casos debo usar un código como:
shp = readShapeSpatial("polygons.shp")
win = as(shp,"owin")
¿Cómo sé qué sintaxis del as
¿Usar para qué objeto?O es la sintaxis: as.foo(originalObject)
siempre equivalente a as(originalObject, "foo")
(aquí foo representa la clase a la que quiero convertir mi objeto para poder usarlo en una función que requiere que su argumento sea un foo
clase)
Digamos que uso un paquete en R con una clase foo
.y tengo una variable v
eso pertenece a la clase bar
(en otras palabras, class(v)
es bar
).¿Cómo sé si la función as(v,"foo")
¿trabajará?
Solución
as.data.frame
es un método S3 que puedes comprobar foo
usando :
getS3method('as.data.frame','foo')
Pero creo que estás buscando (como se comenta)
showMethods(coerce)
Esto le dará una lista de funciones de coerción predefinidas.
Para definir su función de coerción, una opción (hay muchas opciones como setIS
, coerce<-
y coerción implícita a través de la herencia) es utilizar setAs
.Aquí un ejemplo:
track <- setClass("track",
slots = c(x="numeric", y="numeric"))
setAs("track", "numeric", function(from) from@y)
t1 <- new("track", x=1:20, y=(1:20)^2)
as(t1, "numeric")
Ahora si compruebo usando:
showMethods(coerce)
Obtienes una entrada con:
from="track", to="numeric"
Para una mejor explicación deberías leer ayuda("como") pero el tema no es muy sencillo.
EDITAR Para mostrar solo las entradas con track puedes hacer esto por ejemplo:
cat(grep('track',showMethods(coerce,printTo=FALSE),value=TRUE))
from="track", to="numeric"