Ausgabe einer Funktion unterdrücken


90

Ich möchte die Ausgabe eines Befehls (in diesem Fall der applyFunktion) unterdrücken .

Ist es möglich, dies ohne Verwendung zu tun sink()? Ich habe die unten beschriebene Lösung gefunden, möchte dies aber nach Möglichkeit in einer Zeile tun.

So unterdrücken Sie die Ausgabe


2
Können Sie erklären, was Sie unter "Inline machen" verstehen? Andernfalls liefert die von Ihnen zitierte Frage bereits die Antwort, und dies ist ein Duplikat.
Dirk Eddelbuettel

1
Diese Lösung erfordert drei Zeilen, eine Umleitungsausgabe, den Befehl und eine weitere, um die Ausgabe wieder einzuschalten.
Tor

Es ist immer noch eine doppelte Frage.
Dirk Eddelbuettel

8
Oder verwenden capture.output. Oder verwenden Sie *_plyaus dem Plyr-Paket.
Hadley

1
Ich lapplystimme Hadleys Vorschlag zu: Wenn Sie wirklich versuchen, eine Apply- Funktion auszuführen, z. B. ohne Druckausgabe, ist 'l_ply' aus seinem plyrPaket wahrscheinlich die am besten geeignete Wahl.
Sharpie

Antworten:


90

Es ist nicht klar, warum Sie dies ohne tun möchten sink, aber Sie können alle Befehle in die invisible()Funktion einschließen und die Ausgabe wird unterdrückt. Zum Beispiel:

1:10 # prints output
invisible(1:10) # hides it

Andernfalls können Sie die Dinge immer in einer Zeile mit einem Semikolon und Klammern kombinieren:

{ sink("/dev/null"); ....; sink(); }

4
Versuchen Sie 'unsichtbar (Katze ("Hi \ n"))' - invisible()unterdrückt nur den Druck eines Ausdrucks, es ist kein sink()Einzeiler.
Dirk Eddelbuettel

2
Richtig, aber ich denke, dass es die Bedürfnisse des Fragestellers erfüllt, es sei denn, ich vermisse etwas in der Frage ...
Shane

1
Dies unterdrückt beispielsweise die Rückgabe von applygemäß der Frage : invisible(apply(matrix(1:10), 1, as.numeric)).
Shane

Anstatt dass { sink("/dev/null"); ....; sink(); }ich es definitiv vorziehen würde capture.output, wie capture.outputgenau oben, nur viel besser (schauen Sie sich die Quelle an, sie nennt sink wie oben, plus ein paar nette Sachen).
Cookie

2
funktioniert nicht idwunter Windows. Ich denke, die beste Lösung ist die Verwendung vonsink
TMS

56

Verwenden Sie die capture.output()Funktion. Es funktioniert sehr ähnlich wie ein Einzelstück sink()und kann im Gegensatz invisible()dazu mehr als nur das Drucken von Nachrichten unterdrücken. Setzen Sie das Dateiargument /dev/nullunter UNIX oder NULunter Windows. Zum Beispiel unter Berücksichtigung von Dirks Anmerkung:

> invisible(cat("Hi\n"))
Hi

> capture.output( cat("Hi\n"), file='NUL')
> 

10
funktioniert nicht, wenn Sie dies auf eine Funktion anwenden möchten, die einen Wert zurückgibt, und Sie diesen Wert verwenden möchten
TMS

8
@TMS Hat sich in den letzten Monaten etwas geändert? Ich habe gerade getestet, um den von einer Funktion zurückgegebenen Wert zu verwenden, und es hat funktioniert ... capture.output(x <- log(2))und danach xhat es den Wert von log(2)...
drmariod

10

Sie können 'capture.output' wie unten verwenden. Auf diese Weise können Sie die Daten später verwenden:

log <- capture.output({
  test <- CensReg.SMN(cc=cc,x=x,y=y, nu=NULL, type="Normal")
})

test$betas

9

R druckt nur automatisch die Ausgabe nicht zugewiesener Ausdrücke. Weisen Sie also einfach das Ergebnis von applyeiner Variablen zu, und es wird nicht gedruckt.


4
Einige Funktionen haben ein print()oder cat()in sich, das auf den Bildschirm geht, nicht auf eine Zuordnung.
Keithpjolley

6

Die folgende Funktion sollte genau das tun, was Sie wollen:

hush=function(code){
  sink("NUL") # use /dev/null in UNIX
  tmp = code
  sink()
  return(tmp)
}

Zum Beispiel mit der Funktion hier:

foo=function(){
  print("BAR!")
  return(42)
}

Laufen

x = hush(foo())

Weist x 42 zu, druckt aber nicht "BAR!" zu STDOUT

Beachten Sie, dass Sie unter einem UNIX-Betriebssystem "NUL" durch "/ dev / null" ersetzen müssen.


Dies war die einzige Antwort, die das tat, was ich brauchte, unterschätzt.
Tomka

genau das, was ich auch brauchte
gaspar

1

Hadleys Kommentar zu einer Antwort machen (hoffe, sie besser sichtbar zu machen). Die Verwendung der Apply-Familie ohne Druck ist bei Verwendung des plyrPakets möglich

x <- 1:2
lapply(x, function(x) x + 1)
#> [[1]]
#> [1] 2
#> 
#> [[2]]
#> [1] 3

plyr::l_ply(x, function(x) x + 1)

Erstellt am 2020-05-19 durch das reprex-Paket (v0.3.0)


0
invisible(cat("Dataset: ", dataset, fill = TRUE))
invisible(cat(" Width: " ,width, fill = TRUE))
invisible(cat(" Bin1:  " ,bin1interval, fill = TRUE))
invisible(cat(" Bin2:  " ,bin2interval, fill = TRUE))
invisible(cat(" Bin3:  " ,bin3interval, fill = TRUE))

erzeugt eine Ausgabe ohne NULL am Ende der Zeile oder in der nächsten Zeile

Dataset:  17 19 26 29 31 32 34 45 47 51 52 59 60 62 63
Width:  15.33333

Bin1:   17 32.33333
Bin2:   32.33333 47.66667
Bin3:   47.66667 63

0

Falls jemand hier ankommt und nach einer Lösung für RMarkdown sucht, werden alle Ausgaben unterdrückt:

```{r error=FALSE, warning=FALSE, message=FALSE}
invisible({capture.output({

# Your code goes here
2 * 2
# etc
# etc


})})
```

Der Code wird ausgeführt, aber die Ausgabe wird nicht in das HTML-Dokument gedruckt

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.