Menekan keluaran suatu fungsi


90

Saya ingin menekan output dari satu perintah (dalam hal ini, applyfungsinya).

Apakah mungkin melakukan ini tanpa menggunakan sink()? Saya telah menemukan solusi yang dijelaskan di bawah ini, tetapi ingin melakukan ini dalam satu baris jika memungkinkan.

Bagaimana menekan keluaran


2
Bisakah Anda menjelaskan apa yang Anda maksud dengan 'lakukan sebaris ini'? Jika tidak, pertanyaan yang Anda kutip sudah memberikan jawabannya dan ini adalah duplikat.
Dirk Eddelbuettel

1
Solusi ini membutuhkan tiga baris, satu mengarahkan keluaran, perintah, dan kemudian yang lainnya untuk menghidupkan kembali keluaran.
Tor

8
Atau gunakan capture.output. Atau gunakan *_plydari paket plyr.
hadley

1
Saya lapplysetuju dengan saran Hadley- jika Anda benar-benar mencoba untuk menjalankan fungsi terapan , seperti , tanpa mencetak keluaran maka 'l_ply` dari plyrpaketnya mungkin adalah pilihan yang paling tepat.
Sharpie

Jawaban:


92

Tidak jelas mengapa Anda ingin melakukan ini tanpa sink, tetapi Anda dapat membungkus perintah apa pun dalam invisible()fungsi dan itu akan menekan output. Contohnya:

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

Jika tidak, Anda selalu dapat menggabungkan berbagai hal menjadi satu baris dengan titik koma dan tanda kurung:

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

5
Coba 'invisible (cat ("Hi \ n"))' - invisible()hanya menekan cetakan ekspresi, ini bukan sink()satu baris.
Dirk Eddelbuettel

2
Benar, tapi saya pikir itu memenuhi kebutuhan penanya, kecuali saya melewatkan sesuatu dalam pertanyaan ...
Shane

1
Sebagai contoh, ini menekan kembalinya apply, sesuai pertanyaan: invisible(apply(matrix(1:10), 1, as.numeric)).
Shane

Daripada { sink("/dev/null"); ....; sink(); }saya pasti lebih suka capture.output, seperti yang capture.outputdilakukan persis di atas, hanya jauh lebih baik (lihat sumbernya, itu menyebut sink seperti pada mode di atas, ditambah beberapa barang bagus di sekitarnya).
Cookie

3
tidak berfungsi pada idwfungsi di bawah Windows. Saya pikir solusi terbaik adalah menggunakansink
TMS

58

Gunakan capture.output()fungsinya. Ia bekerja sangat mirip sekali sink()dan tidak seperti invisible(), ia dapat menekan lebih dari sekedar pesan cetak. Setel argumen file ke /dev/nullUNIX atau NULdi windows. Misalnya, mengingat catatan Dirk:

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

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

10
tidak berfungsi jika Anda ingin menerapkan ini ke fungsi yang mengembalikan beberapa nilai dan Anda ingin menggunakan nilai ini
TMS

8
@TMS Apakah ada yang berubah selama beberapa bulan terakhir? Saya baru saja menguji untuk menggunakan nilai yang dikembalikan oleh suatu fungsi dan berhasil ... capture.output(x <- log(2))dan setelah itu xmemiliki nilai log(2)...
drmariod

10

Anda dapat menggunakan 'capture.output' seperti di bawah ini. Ini memungkinkan Anda untuk menggunakan data nanti:

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

test$betas

9

R hanya secara otomatis mencetak output dari ekspresi yang tidak ditetapkan, jadi tetapkan saja hasil dari applyke variabel, dan itu tidak akan dicetak.


4
Beberapa fungsi memiliki print()atau cat()di dalamnya yang masuk ke layar, bukan ke tugas.
keithpjolley

9

Fungsi berikut harus melakukan apa yang Anda inginkan dengan tepat:

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

Misalnya dengan fungsi di sini:

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

berlari

x = hush(foo())

Akan menetapkan 42 ke x tetapi tidak akan mencetak "BAR!" ke STDOUT

Perhatikan bahwa di OS UNIX Anda perlu mengganti "NUL" dengan "/ dev / null"


Ini adalah satu-satunya jawaban yang melakukan apa yang saya butuhkan, diremehkan.
tomka

persis apa yang saya butuhkan juga
gaspar

3

Jika ada yang datang ke sini mencari solusi yang berlaku untuk RMarkdown, ini akan menekan semua keluaran:

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

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


})})
```

Kode akan berjalan, tetapi hasilnya tidak akan dicetak ke dokumen HTML


1

Membuat komentar Hadley menjadi sebuah jawaban (berharap membuatnya lebih terlihat). Penggunaan keluarga terapan tanpa pencetakan dimungkinkan dengan penggunaan plyrpaket

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

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

Dibuat pada 2020-05-19 oleh paket 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))

menghasilkan keluaran tanpa NULL di akhir baris atau di baris berikutnya

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.