2017-07-24 6 views
0

Ich arbeite auf Lagerstättensimulationsobjekte in R und in einer bestimmten Weise versuche ich eine Struktur in Matlab zu replizieren, die in 3D funktioniert. Das Objekt hat mehrere Attribute.Eine Matlab-Struktur-ähnliche in R

Grid.Nx, Grid.Ny, Grid.Nz, 
Grid.hz, Grid.hy, Grid.hy, 
Grid.por 

Dies ist Matlab/Octave funktioniert super. Wenn ich zum Beispiel Grid eintippe, werden automatisch alle Attribute und Werte angezeigt, die Grid enthält. Das Objekt in R, das sich näher verhält, ist list(). Aber es ist nicht ganz dasselbe.

kam ich mit tun dies mit S4-Klassen nach oben, wie folgt aus:

setClass("Grid", slots = c(
    Nx = "numeric", 
    Ny = "numeric", 
    Nz = "numeric", 
    por = "numeric" 
)) 

setGeneric("Grid.Nx<-", function(object, value){standardGeneric("Grid.Nx<-")}) 
setReplaceMethod(f="Grid.Nx", signature="Grid", 
       definition=function(object, value){ 
        [email protected] <- value 
        return (object) 
}) 

setGeneric("Grid.Ny<-", function(object, value){standardGeneric("Grid.Ny<-")}) 
setReplaceMethod(f="Grid.Ny", signature="Grid", 
       definition=function(object, value){ 
        [email protected] <- value 
        return (object) 
}) 

setGeneric("Grid.Nz<-", function(object, value){standardGeneric("Grid.Nz<-")}) 
setReplaceMethod(f="Grid.Nz", signature="Grid", 
       definition=function(object, value){ 
        [email protected] <- value 
        return (object) 
}) 

Grid.Nx <- 3 
Grid.Ny <- 8 
Grid.Nz <- 4 
Grid.Nx 
Grid.Ny 
Grid.Nz 

Es gibt nur wenige andere Objekte im Simulationsprojekt sind, die wie folgt arbeiten. Bevor ich mit dieser Idee der S4 Klassen fortfuhr, wollte ich wissen, ob ich mich in die richtige Richtung bewege, oder es gibt bessere Alternativen.

Antwort

0

Ich glaube, ich fand, dass der beste Weg, um diese Aufgabe neu zu erstellen R6 Klassen verwendet:

Grid <- R6Class("Grid", 
    public = list(
     Nx = 0, Ny = 0, Nz = 0, 
     hx = 0, hy = 0, hz = 0, 
     K = NA, 
     N = NA, 
    initialize = function(Nx, Ny, Nz) { 
     self$Nx = Nx 
     self$Ny = Ny 
     self$Nz = Nz 
     self$hx = 1/self$Nx 
     self$hy = 1/self$Ny 
     self$hz = 1/self$Nz 
     self$K = array(1, c(3, self$Nx, self$Ny)) 
     self$N = self$Nx * self$Ny * self$Nz 
     cat(sprintf("Grid of %dx%dx%d", self$Nx, self$Ny, self$Nz)) 
     image(self$K[1,,]) 
     } 
    ) 
) 

grid <- Grid$new(8, 8, 1) 
# Grid of 8x8x1 

Es ist weniger ausführlich als S4 und Art folgt von -keine 100% exactly- das Objekt Abstraktion Matlab.