teoria subconjuntos subconjunto propio primaria para operaciones ejercicios ejemplos conjuntos con oop r subset s4

oop - subconjuntos - teoria de conjuntos ejemplos



¿Cómo definir los operadores de subconjunto para una clase S4? (2)

Estoy teniendo problemas para encontrar la manera correcta de definir los operadores de subconjuntos [ , $ y [[ para una clase S4).

¿Puede alguien proporcionarme un ejemplo básico de la definición de estos tres para una clase S4?


Descubre el genérico para que sepamos a qué apuntamos.

> getGeneric("[") standardGeneric for "[" defined from package "base" function (x, i, j, ..., drop = TRUE) standardGeneric("[", .Primitive("[")) <bytecode: 0x32e25c8> <environment: 0x32d7a50> Methods may be defined for arguments: x, i, j, drop Use showMethods("[") for currently available ones.

Define una clase sencilla

setClass("A", representation=representation(slt="numeric"))

e implementar un método

setMethod("[", c("A", "integer", "missing", "ANY"), ## we won''t support subsetting on j; dispatching on ''drop'' doesn''t ## make sense (to me), so in rebellion we''ll quietly ignore it. function(x, i, j, ..., drop=TRUE) { ## less clever: update slot, return instance ## x@slt = x@slt[i] ## x ## clever: by default initialize is a copy constructor, too initialize(x, slt=x@slt[i]) })

En acción:

> a = new("A", slt=1:5) > a[3:1] An object of class "A" Slot "slt": [1] 3 2 1

Existen diferentes estrategias para admitir (implícitamente) muchas firmas, por ejemplo, es probable que también desee admitir valores de índice lógico y de caracteres, posiblemente para i y j. El más directo es un patrón de "fachada" en el que cada método realiza una coerción preliminar a un tipo común de índice de subconjunto, por ejemplo, un integer para permitir el reordenamiento y la repetición de entradas de índice, y luego usa callGeneric para invocar un solo método Eso hace el trabajo de subconjunto de la clase.

No hay diferencias conceptuales para [[ , aparte de querer respetar la semántica de devolver el contenido en lugar de otra instancia del objeto como lo implica [ . Por $ tenemos

> getGeneric("$") standardGeneric for "$" defined from package "base" function (x, name) standardGeneric("$", .Primitive("$")) <bytecode: 0x31fce40> <environment: 0x31f12b8> Methods may be defined for arguments: x Use showMethods("$") for currently available ones.

y

setMethod("$", "A", function(x, name) { ## ''name'' is a character(1) slot(x, name) })

con

> a$slt [1] 1 2 3 4 5


Haría lo que @Martin_Morgan sugirió para los operadores que mencionó. Me gustaría añadir un par de puntos sin embargo:

1) Tendría cuidado al definir un operador $ para acceder a una ranura S4 (a menos que intente acceder a una columna desde un marco de datos que se almacena en una ranura específica). La sugerencia general es escribir funciones de getMySlot() como getMySlot() y setMySlot() para obtener la información que necesita. Puede usar el operador @ para acceder a los datos de esas ranuras, aunque obtener y configurar son mejores como una interfaz de usuario. Usar $ podría ser confuso para el usuario, quien probablemente esperaría un data.frame. Vea this tutorial de S4 por Christophe Genolini para una discusión en profundidad de estos temas. Si no es así como pretendía usar $ , ignore mi sugerencia (¡pero el tutorial sigue siendo un gran recurso!).

2) Si está definiendo [ y [[ para heredar de otra clase, como vector, también querrá definir el() (equivalente a [][[1L]] , o el primer elemento de un subconjunto [] ) y length() . Actualmente estoy escribiendo una clase para heredar de un método numérico, y los métodos numéricos intentarán automáticamente usar estas funciones de su clase. Si la clase es para un uso más limitado o personal, esto puede no ser un problema.

Me disculpo, habría dejado esto como un comentario, pero soy nuevo en SO y todavía no tengo el representante!