2012-07-25 12 views
39

R help erklärt invisible() als "eine Funktion, die eine vorübergehend unsichtbare Kopie eines Objekts zurückgibt". Ich habe Schwierigkeiten zu verstehen, was für invisible() verwendet wird. Würdest du erklären können, was invisible() macht und wann diese Funktion nützlich sein kann?Was macht die Funktion invisible()?

Ich habe gesehen, dass invisible() fast immer in Methodenfunktionen für die print() verwendet wird. Hier ein Beispiel:

### My Method function: 
print.myPrint <- function(x, ...){ 
    print(unlist(x[1:2])) 
    invisible(x) 
} 

x = list(v1 = c(1:5), v2 = c(-1:-5)) 
class(x) = "myPrint" 
print(x) 

Ich dachte, dass ohne invisible(x), würde ich nicht in der Lage sein, Zuordnung zu tun:

a = print(x) 

Aber es ist eigentlich nicht der Fall. Also, ich würde gerne wissen, was invisible() tut, wo es nützlich sein kann, und schließlich, was es Rolle ist in der Methode Druckfunktion oben?

Vielen Dank für Ihre Hilfe.

+13

Ich kann Ihnen eine Antwort geben, aber ich kann es Ihnen nicht zeigen. – mdsumner

Antwort

23

Von ?invisible:

Details:

This function can be useful when it is desired to have functions 
return values which can be assigned, but which do not print when 
they are not assigned. 

So können Sie das Ergebnis zuweisen, aber es wird nicht gedruckt werden, wenn nicht belegt. Es wird oft anstelle von return verwendet. Ihre print.myPrint Methode wird nur gedruckt, weil Sie explizit print aufrufen. Der Aufruf an invisible(x) am Ende Ihrer Funktion gibt einfach eine Kopie von x zurück.

Wenn Sie invisible nicht verwendet haben, wird x auch gedruckt, wenn nicht zugewiesen. Zum Beispiel:

R> print.myPrint <- function(x, ...){ 
+ print(unlist(x[1:2])) 
+ return(x) 
+ } 
R> print(x) 
v11 v12 v13 v14 v15 v21 v22 v23 v24 v25 
    1 2 3 4 5 -1 -2 -3 -4 -5 
v11 v12 v13 v14 v15 v21 v22 v23 v24 v25 
    1 2 3 4 5 -1 -2 -3 -4 -5 
7

Während invisible() ihr Inhalt oft vorübergehend unsichtbar und wird verwendet, es eher in Kombination mit return() und nicht als deren Ersatz sollte statt return() macht.

Während return() die Ausführung der Funktion stoppen und den eingegebenen Wert zurückgeben, wird invisible() dies nicht tun. Es macht seinen Inhalt nur für eine Weile unsichtbar.

Betrachten Sie die folgenden zwei Beispiele:

f1 <- function(x){ 
    if(x > 0){ 
    invisible("bigger than 0") 
    }else{ 
    return("negative number") 
    } 
    "something went wrong" 
} 

result <- f1(1) 

result 
## [1] "something went wrong" 



f2 <- function(x){ 
    if(x > 0){ 
    return(invisible("bigger than 0")) 
    }else{ 
    return("negative number") 
    } 
} 

result <- f2(1) 

result 
## [1] "bigger than 0" 

umgangen Nachdem invisible() ‚s pitfall wir einen Blick auf seine Arbeits haben:

f2(1) 

Die Funktion druckt nicht aufgrund seiner Rückgabewert zur Verwendung von invisible(). Es spielt passieren jedoch auf den Wert wie gewohnt:

res <- f2(1) 
res 
## [1] "bigger than 0" 

invisible() ‚s Anwendungsfälle sind beispielsweise um Funktionsrückgabewerte zu verhindern, die Seite für Seite der Ausgabe erzeugen würden oder wenn eine Funktion für ihre Nebenwirkung aufgerufen wird und der Rückgabewert z.B.nur verwendet, um weitere Informationen zu geben ...

+1

Wenn ich aus anderen Programmiersprachen komme, macht es mehr Sinn, wenn ich feststelle, dass R implizit viele Dinge druckt. Ich würde ein solches Drucken als Nebeneffekt betrachten und das unsichtbare() macht es nicht. – Chris