2017-10-05 3 views
0

Ich bin neu in R. Lesebuch von R von Tilman Davies. Es wird ein Beispiel für die Verwendung einer extern definierten Hilfsfunktion angegeben, die zufälligerweise doppelte eckige Klammern [[]] verwendet. Bitte erläutern Sie, was helper.call [[1]] und helper.call [[2]] tun und verwenden Sie hier doppelte Klammern.Verwendung von doppelten Klammern unklar

multiples_helper_ext <- function(x=foo,matrix.flags,mat=diag(2){ 
    indexes <- which(matrix.flags) 
    counter <- 0 
    result <- list() 
    for(i in indexes){ 
    temp <- x[[i]] 
    if(ncol(temp)==nrow(mat)){ 
     counter <- counter+1 
     result[[counter]] <- temp%*%mat 
    } 
    } 
    return(list(result,counter)) 
} 

multiples4 <- function(x,mat=diag(2),str1="no valid matrices",str2=str1){ 
    matrix.flags <- sapply(x,FUN=is.matrix) 

    if(!any(matrix.flags)){ 
    return(str1) 
    } 

    helper.call <- multiples_helper_ext(x,matrix.flags,mat=diag(2) 
    result <- helper.call[[1]] #I dont understand this use of double bracket 
    counter <- helper.call[[2]] #and here either 

    if(counter==0){ 
    return(str2) 
    } else { 
    return(result) 
    } 
} 
foo <- list(matrix(1:4,2,2),"not a matrix","definitely not a matrix",matrix(1:8,2,4),matrix(1:8,4,2)) 
+2

Vorgeschlagene Betrogene: [Unterschied zwischen \ [\] und \ [\ [\] \]?] (Https://Stackoverflow.com/q/1169456/903061), obwohl [Wie verwendet man Listen in R korrekt? ?] (https://stackoverflow.com/q/2050790/90306) ist ebenfalls relevant. Kurz gesagt, wenn "x" eine Liste ist, dann wählt "x [[1]]" das erste Element von "x", während "x [1]" eine Unterliste (noch eine Liste!) Enthält, die das erste Element von "x" enthält '. Verwenden Sie 'help (" [[")' für die integrierte Hilfe. – Gregor

+0

In welcher Liste werden die doppelten Klammern referenziert? – Aitch

+0

Die Funktion gibt 'list (result, counter)' zurück. So bezieht sich 'helper.call [[1]]' auf 'result'. –

Antwort

0

In R gibt es zwei grundlegende Arten von Objekten: Listen und Vektoren. Die Elemente von Listen können andere Objekte sein, die Elemente der Vektoren sind in der Regel Zahlen, Strings usw.

Um Elemente in einer Liste zuzugreifen, verwenden Sie die doppelte Klammer [[]]. Dies gibt das Objekt an dieser Stelle der Liste zurück. So

x <- 1:10 

x ist nun ein Vektor von ganzen Zahlen

L <- list(x, x, "hello") 

L eine Liste, deren erste Element ist der Vektor x, dessen zweite Element ist der Vektor x, und seine dritte Element ist die Zeichenfolge "Hallo". Diese

L[[2]] 

zurück geben einen Vektor, 01.10, die in der 2. Platz in L. gespeichert

L[2] 

Dies ist ein wenig verwirrend ist, aber das gibt wieder eine Liste, deren einzige Element ist 1:10, dh es enthält nur L [[2]].

In R, wenn Sie mehrere Werte zurückgeben möchten, können Sie tun dies in der Regel mit einer Liste. Also, Sie könnten Sie funktionieren am Ende mit

f <- function() { 
    return(list(result1="hello", result2=1:10)) 
} 
x = f() 

Jetzt können Sie die beiden Ergebnisse Zugriff mit

print(x[["result1"]]) 
print(x[["result2"]]) 

Sie können auch Elemente einer Liste Zugriff mit ‚‘ $, so stattdessen können Sie schreiben

Verwandte Themen