Bir işlevin çıktısını bastır


91

Bir komutun çıktısını bastırmaya çalışıyorum (bu durumda, applyişlev).

Bunu kullanmadan yapmak mümkün mü sink()? Aşağıda açıklanan çözümü buldum, ancak mümkünse bunu tek satırda yapmak istiyorum.

Çıktı nasıl bastırılır


2
'Bunu satır içi yapın' ile ne demek istediğinizi açıklayabilir misiniz? Aksi takdirde, alıntı yaptığınız soru zaten cevabı sağlıyor ve bu bir kopya.
Dirk Eddelbuettel

1
Bu çözüm üç satır gerektirir, biri yeniden yönlendirme çıkışı, komut ve ardından çıktıyı tekrar açmak için bir başkası.
Tor

8
Veya kullanın capture.output. Veya *_plyplyr paketinden kullanın .
hadley

1
Hadley'in önerisini ikinci kez söylüyorum - eğer lapplyçıktıyı yazdırmadan gibi bir uygulama işlevini gerçekten yürütmeye çalışıyorsanız , o zaman plyrpaketinden 'l_ply' muhtemelen en uygun seçimdir.
Sharpie

Yanıtlar:


93

Bunu neden yapmadan yapmak istediğiniz açık değil sink, ancak invisible()işlevdeki herhangi bir komutu kaydırabilirsiniz ve çıktıyı bastırır. Örneğin:

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

Aksi takdirde, her şeyi bir satırda noktalı virgül ve parantez ile birleştirebilirsiniz:

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

5
'Görünmez (kedi ("Merhaba \ n"))' deneyin - invisible()sadece bir ifadenin baskısını bastırır, tek satırlık değildir sink().
Dirk Eddelbuettel

2
Doğru, ama soruda bir şey
kaçırmıyorsam

1
Örneğin, bu dönüşü bastırır applysorusuna gereğince,: invisible(apply(matrix(1:10), 1, as.numeric)).
Shane

Yerine { sink("/dev/null"); ....; sink(); }kesinlikle tercih ediyorum capture.output, hem capture.outputetkin bir (yukarıdaki şekilde olduğu gibi lavabo çağırır kaynağında bir göz, artı bazı güzel şeyler etrafında) sadece daha çok, aynen yukarıda yapar.
Cookie

3
idwWindows altında işlev üzerinde çalışmaz. En iyi çözümün kullanmak olduğunu düşünüyorumsink
TMS

58

capture.output()İşlevi kullanın . Bir kereye mahsus gibi çalışır sink()ve aksine invisible(), mesajları yazdırmaktan daha fazlasını bastırabilir. Dosya bağımsız değişkenini /dev/nullUNIX veya NULWindows'ta olarak ayarlayın. Örneğin, Dirk'in notunu düşünürsek:

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

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

10
bunu bir değer döndüren bir işleve uygulamak istiyorsanız ve bu değeri kullanmak istiyorsanız çalışmaz
TMS

8
@TMS Son birkaç ay içinde bir şey mi değişti? Bir işlev tarafından döndürülen değeri kullanmak için test ettim ve işe yaradı ... capture.output(x <- log(2))ve daha sonra xdeğerine sahip log(2)...
drmariod

10

aşağıdaki gibi 'capture.output' kullanabilirsiniz. Bu, verileri daha sonra kullanmanıza izin verir:

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

test$betas

10

Aşağıdaki işlev tam olarak istediğiniz şeyi yapmalıdır:

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

Örneğin, buradaki işlevle:

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

koşma

x = hush(foo())

42'yi x'e atayacak, ancak "BAR!" STDOUT'a

Unix OS'de "NUL" u "/ dev / null" ile değiştirmeniz gerekeceğini unutmayın.


İhtiyacım olanı küçümseyen tek cevap buydu.
tomka

tam olarak ihtiyacım olan şey
gaspar

9

R yalnızca atanmamış ifadelerin çıktısını otomatik olarak yazdırır, bu nedenle sonucunu applybir değişkene atarsanız yazdırılmaz.


4
Bazı işlevler, bir atamaya değil ekrana giden bir print()veya cat()içlerine sahiptir.
keithpjolley

3

RMarkdown için geçerli bir çözüm arayan birinin buraya gelmesi durumunda, bu tüm çıktıları bastıracaktır:

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

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


})})
```

Kod çalışır, ancak çıkış olacak değil HTML belgesine basılacak


1

Cevaba Hadley'in yorumunu yapmak (daha iyi görünür kılmayı umuyoruz). plyrPaket kullanımı ile baskı yapmadan uygulama ailesinin kullanılması mümkündür.

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

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

2020-05-19 tarihinde reprex paketi tarafından oluşturuldu (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))

satırın sonunda veya sonraki satırda NULL olmadan çıktı üretir

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.