Pomiń wyjście funkcji


90

Chcę ukryć dane wyjściowe jednego polecenia (w tym przypadku applyfunkcji).

Czy można to zrobić bez użycia sink()? Opisane rozwiązanie znalazłem poniżej, ale chciałbym to zrobić w jednej linii, jeśli to możliwe.

Jak wyłączyć wyjście


2
Czy możesz wyjaśnić, co masz na myśli, mówiąc „zrób to w tekście”? W przeciwnym razie pytanie, które cytujesz, zawiera już odpowiedź i jest to duplikat.
Dirk Eddelbuettel

1
To rozwiązanie wymaga trzech wierszy, jednego przekierowania wyjścia, polecenia, a następnie drugiego, aby ponownie włączyć wyjście.
Tor,

8
Lub użyj capture.output. Lub użyj *_plyz pakietu plyr.
hadley

1
Po drugie, sugestia Hadleya - jeśli naprawdę próbujesz wykonać funkcję stosującą, taką jak lapplybez drukowania wyniku, wówczas 'l_ply' z jego plyrpakietu jest prawdopodobnie najbardziej odpowiednim wyborem.
Sharpie

Odpowiedzi:


92

Nie jest jasne, dlaczego chcesz to zrobić bez sink, ale możesz zawijać dowolne polecenia w invisible()funkcji, a to zablokuje wyjście. Na przykład:

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

W przeciwnym razie zawsze możesz połączyć elementy w jedną linię za pomocą średnika i nawiasów:

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

5
Spróbuj 'invisible (cat ("Hi \ n"))' - invisible()tylko pomija drukowanie wyrażenia, nie jest to sink()jednowierszowe.
Dirk Eddelbuettel

2
Racja, ale myślę, że spełnia potrzeby pytającego, chyba że brakuje mi czegoś w pytaniu ...
Shane

1
Na przykład, ten tłumi zwrotu apply, jak na pytanie: invisible(apply(matrix(1:10), 1, as.numeric)).
Shane

Raczej { sink("/dev/null"); ....; sink(); }wolałbym capture.output, jak capture.outputskutecznie robi dokładnie powyżej, tylko o wiele lepiej (spójrz na źródło, nazywa się sink jak w powyższym stylu, plus kilka fajnych rzeczy wokół niego).
Cookie

3
nie działa na idwfunkcji w systemie Windows. Myślę, że najlepszym rozwiązaniem jest użyciesink
TMS

58

Użyj capture.output()funkcji. Działa bardzo podobnie jak jednorazowy sink()i w przeciwieństwie do invisible()tego, może tłumić więcej niż tylko drukować wiadomości. Ustaw argument plik na /dev/nullw systemie UNIX lub w systemie NULWindows. Na przykład, biorąc pod uwagę notatkę Dirka:

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

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

10
nie działa, jeśli chcesz zastosować to do funkcji, która zwraca jakąś wartość i chcesz użyć tej wartości
TMS

8
@TMS Czy coś się zmieniło w ciągu ostatnich kilku miesięcy? Właśnie przetestowałem, aby użyć wartości zwróconej przez funkcję i zadziałało ... capture.output(x <- log(2))a potem xma wartość log(2)...
drmariod

10

możesz użyć „capture.output” jak poniżej. Umożliwia to późniejsze wykorzystanie danych:

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

test$betas

9

R tylko automatycznie drukuje wyjście nieprzypisanych wyrażeń, więc po prostu przypisz wynik applyzmiennej do zmiennej, a nie zostanie on wydrukowany.


4
Niektóre funkcje mają w sobie znak print()lub, cat()który przechodzi do ekranu, a nie do przypisania.
keithpjolley

9

Następująca funkcja powinna zrobić dokładnie to, co chcesz:

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

Na przykład z funkcją tutaj:

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

bieganie

x = hush(foo())

Przypisuje 42 do x, ale nie wypisuje "BAR!" do STDOUT

Uwaga niż w systemie UNIX trzeba będzie zamienić „NUL” na „/ dev / null”


To była jedyna odpowiedź, która zrobiła to, czego potrzebowałem, niedoceniana.
tomka

dokładnie to, czego potrzebowałem
gaspar

3

W przypadku, gdy ktoś przyjeżdża tutaj i szuka rozwiązania odpowiedniego dla RMarkdown, spowoduje to zablokowanie wszystkich danych wyjściowych:

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

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


})})
```

Kod zostanie uruchomiony, ale dane wyjściowe nie zostaną wydrukowane w dokumencie HTML


1

Dodanie komentarza Hadley do odpowiedzi (mam nadzieję, że będzie ona lepiej widoczna). Korzystanie z rodziny aplikacyjnej bez nadruku jest możliwe przy użyciu plyrpakietu

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

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

Utworzona 2020-05-19 przez pakiet reprex (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))

generuje wyjście bez wartości NULL na końcu wiersza lub w następnym wierszu

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.