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.