2016-05-23 13 views
7

I eine Funktion geschaffen, die vier Ausgangs Argumente hat, zum Beispiel:Ausblenden eines Ergebnisses einer Funktion in R

myfuction<-function(...){  
    #Inside the function I created four results A, B, C, and D.  
    A = ...  
    B = ...  
    C = ...  
    D = ...  
    z<-list(MacKinnon=A,regression=B,proof=C, res=D)  
    return(z) 
} 

Das Ergebnis D auf einen Vektor von Zahlen entspricht, dass die Residuen einer Regressions respresents.

Meine Frage ist Wie kann ich dieses Ergebnis ausblenden, ohne es zu entfernen? Das heißt, ich möchte, dass wenn ich die Funktion ausführen, die Ergebnisse A, B und C erscheinen, aber nicht das Ergebnis D.

Und wenn ich auf das Ergebnis D zugreifen möchte, muss ich etwas tun:

X <-myfuction (...) 
X$res 

in der Lage sein, den Rest zu beobachten.

+2

Sie können Ihrer zurückgegebenen Liste eine Klasse zuweisen und eine benutzerdefinierte Druckmethode für diese Klasse schreiben, aber das ist eine Menge Arbeit, nur um einen Wert auf dem Bildschirm auszublenden. – MrFlick

+0

wie MrFlick bemerkt, erfordert dies ein objektorientiertes Design. –

Antwort

9

Ich würde nur eine S3-Klasse verwenden. Grundsätzlich markiert nur das Objekt z mit einer bestimmten Klasse

myfunction <- function(){  
    #Inside the function I created four results A, B, C, and D.  
    A = 10;B = 20;C = 30; D = 40  
    z = list(MacKinnon=A, regression=B, proof=C, res=D)  
    class(z) = "my_fun" # Tagging here 
    return(z) 
} 

Eine S3-Druckfunktion für my_fun

print.my_fun = function(x, ...) print(x[1:3]) 

Dann

R> x = myfunction() 
R> x 
$MacKinnon 
[1] 10 

$regression 
[1] 20 

$proof 
[1] 30 

Aber

R> x$res 
[1] 40 

gibt Ihnen wollen Sie wollen.


Ein paar Kommentare/Zeiger.

  • Normalerweise, wenn Sie die Klasse zuweisen, würden Sie so etwas wie

    class(z) = c("my_fun", class(z)) 
    

    jedoch verwenden, da wir in der Zeile über nur z erstellt, ist dies nicht erforderlich.

  • Derzeit entfernt die print Methode alle zusätzlichen Klassen (im Beispiel gibt es nur eine Klasse, also ist es kein Problem). Wenn wir mehrere Klasse halten wollten, würden wir

    print.my_fun = function(x, ...) { 
        x = structure(x[1:3], class = class(x)) 
        NextMethod("print") 
    } 
    

    Die erste Zeile der Funktion Teilmengen x, verwenden aber pflegt alle anderen Klassen. Die zweite Zeile übergibt dann x an die nächste print.class_name Funktion.

+0

Vielen Dank, ich fand es sehr nützlich –

+0

Im Allgemeinen kann es sicherer sein, 'class (z) = c (" my_fun ", Klasse (z))' zu verwenden, um Vererbung von anderen bereits vorhandenen Methoden zu gewährleisten Sie möchten nicht explizit definieren. – dww

+0

@dww Danke - Ich habe die Antwort aktualisiert. Es ist hier nicht wirklich notwendig, aber es ist gut zu erwähnen. – csgillespie

0

Sie können invisible verwenden.

Zum Beispiel würde dies nichts an der Konsole aus, sondern lassen Sie es zuweisen ist Ausgabe:

myfunction<-function(){ 
    #Inside the function I created four results A, B, C, and D. 
    A = 1; B = 2; C = 3; D = 4 
    z<-list(MacKinnon=A,regression=B,proof=C, res=D) 
    return(invisible(z)) 
} 

myfunction()  # nothing prints 
x <- myfunction() 
x     # now it does! 
# $MacKinnon 
# [1] 1 

# $regression 
# [1] 2 

# $proof 
# [1] 3 

# $res 
# [1] 4 

Wenn Sie auf der Konsole ausgegeben bestimmte Teile möchten, können Sie print oder cat für diejenigen nutzen können.

myfunction<-function(){ 
    #Inside the function I created four results A, B, C, and D. 
    A = 1; B = 2; C = 3; D = 4 
    z<-list(MacKinnon=A,regression=B,proof=C, res=D) 
    print(A) 
    return(invisible(z)) 
} 

myfunction() 
# [1] 1 

Dies ist nützlich, wenn Sie die Ausgabe nicht gedruckt werden soll, wenn die Funktion ohne zugewiesen läuft wird. Wenn Sie nicht drucken möchten, nachdem es einer Variablen zugewiesen wurde, sollten Sie eine print Methode wie @csgillespie vorschlagen.

+0

Vielen Dank –

Verwandte Themen