2017-12-02 18 views
0

Unten habe ich eine Funktion erstellt haben, die mit modifizierten Eigenschaften einer Struktur kehrt mit einem neuen Objekt zurückgibts3 Anfänger - wie neue s3 Struktur zu verwenden?

f <- function(loc) { 
    structure(list(loc = loc , arg1=0 , c_val=c()), 
      class="myclass") 
} 

Mein Verständnis dieses Codes ist: legt drei Attribute in die Objektliste. Die Attribute lauten loc, arg1 und c_val(). Eine neue Klasse namens myclass ist dieser Funktion zugeordnet.

Verwenden Sie eine neue Funktion, um Werte zu dieser Struktur hinzuzufügen und den Status beizubehalten?

Antwort

1

loc, arg1 und val sind Komponenten der internen Listenstruktur, manchmal auch als Slots bezeichnet. Attribute wären etwas anderes.

Mit dem Konstruktor, den Sie bereits erstellt haben, erhalten Sie viele Methoden kostenlos, obwohl Sie sie überschreiben könnten.

# create a new object 
obj <- f(1) 

# get arg1 
obj$arg1 
## [1] 0 

# update arg1 
obj$arg1 <- 2 

# get arg1 
obj$arg1 
## [1] 2 

print(obj) 

Der letzte ergibt:

$loc 
[1] 1 

$arg1 
[1] 2 

$c_val 
NULL 

attr(,"class") 
[1] "myclass" 

einen benutzerdefinierten Druckverfahren definieren:

print.myclass <- str 
print(obj) 

das ergibt:

List of 3 
$ loc : num 1 
$ arg1 : num 2 
$ c_val: NULL 
- attr(*, "class")= chr "myclass" 

eine benutzerdefinierte Getter definieren:

`$.myclass` <- function(x, name) { 
    cat("getting", name, "\n") 
    .subset2(x, name) 
} 
obj$arg1 

geben:

getting arg1 
[1] 2 

Wenn Sie Beispiele, die die Zoo-Paket zu sehen, die S3-Klassen definiert, zoo, zooreg, yearmon und yearqtr und viele Methoden für jeden.

1

Eine zusammenfassende Antwort auf Ihre Frage ist, dass Sie Getter-und Setter-Funktionen als Teil Ihrer Objektdefinition erstellen müssen, und geben Sie ihnen Namen, wenn Sie das Objekt mit list() generieren.

myObject <- function(x){ 
    # create attributes 
    attribute1 <- NULL 
    attribute2 <- NULL 
    # create getter and setter functions, using <<- form of assignment operator 
    setAttribute1 <- function(x) attribute1 <<- x 
    getAttribute1 <- function() attribute1 
    setAttribute2 <- function(x) attribute2 <<- x 
    getAttribute2 <- function() attribute2 
    list(setAttribute1 = setAttribute1, 
      getAttribute1 = getAttribute1, 
      setAttribute2 = setAttribute2, 
      getAttribute2 = getAttribute2) 
} 

die Funktionen in der list() Funktion Benennung ist ein wichtiger Schritt, weil es Ihnen erlaubt, die Funktionen über die $ Form des Extraktes Operators zuzugreifen.

Nachdem wir unser Objekt definiert haben, verwenden wir es, um Werte für attribute1 festzulegen und abzurufen.

Dieser Code generiert die folgende Ausgabe an die R-Konsole.

> x <- myObject() 
> 
> x$setAttribute1(15) 
> x$getAttribute1() 
[1] 15 
> 

Weitere Einzelheiten zu diesem Thema einschließlich Hintergrundinformationen über die Verwendung der <<- Form des Zuweisungsoperators, ich werde Sie auf einen Artikel verweise ich für die Johns Hopkins University R Programmierung Kurs auf Coursera schrieb, adressiert dieses spezifische Problem, .