Ngăn chặn đầu ra của một hàm


90

Tôi đang tìm cách chặn đầu ra của một lệnh (trong trường hợp này là applyhàm).

Có thể làm điều này mà không cần sử dụng sink()? Tôi đã tìm thấy giải pháp được mô tả bên dưới, nhưng tôi muốn thực hiện điều này trong một dòng nếu có thể.

Làm thế nào để ngăn chặn đầu ra


2
Bạn có thể giải thích những gì bạn có nghĩa là "làm điều này nội dòng"? Nếu không, câu hỏi bạn trích dẫn đã cung cấp câu trả lời và đây là một bản sao.
Dirk Eddelbuettel

1
Giải pháp này yêu cầu ba dòng, một đầu ra chuyển hướng, lệnh và sau đó là một dòng khác để bật lại đầu ra.
Tor

8
Hoặc sử dụng capture.output. Hoặc sử dụng *_plytừ gói plyr.
hadley

1
Tôi thứ hai là gợi ý lapplycủa Hadley- nếu bạn thực sự đang cố gắng thực thi một hàm áp dụng, chẳng hạn như , mà không in đầu ra thì 'l_ply` từ plyrgói của anh ấy có lẽ là lựa chọn thích hợp nhất.
Sharpie

Câu trả lời:


92

Không rõ tại sao bạn lại muốn làm điều này mà không có sink, nhưng bạn có thể bọc bất kỳ lệnh nào trong invisible()hàm và nó sẽ chặn đầu ra. Ví dụ:

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

Nếu không, bạn luôn có thể kết hợp mọi thứ thành một dòng với dấu chấm phẩy và dấu ngoặc đơn:

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

5
Hãy thử 'vô hình (mèo ("Hi \ n"))' - invisible()chỉ ngăn chặn việc in một biểu thức, nó không phải là sink()một chữ lót.
Dirk Eddelbuettel

2
Đúng vậy, nhưng tôi nghĩ rằng nó đáp ứng các nhu cầu của người chất vấn, trừ khi tôi đang thiếu một cái gì đó trong câu hỏi ...
Shane

1
Ví dụ, điều này ngăn chặn sự trở lại của apply, theo câu hỏi: invisible(apply(matrix(1:10), 1, as.numeric)).
Shane

Thay vì { sink("/dev/null"); ....; sink(); }tôi chắc chắn muốn capture.output, như capture.outputhiệu quả chính xác ở trên, chỉ tốt hơn rất nhiều (hãy nhìn vào nguồn, nó gọi là chìm như ở trên, cộng với một số thứ hay ho xung quanh nó).
Cookie

3
không hoạt động trên idwchức năng của Windows. Tôi nghĩ rằng giải pháp tốt nhất là sử dụngsink
TMS

58

Sử dụng capture.output()chức năng. Nó hoạt động rất giống một lần sink()và không giống như invisible(), nó có thể ngăn chặn nhiều hơn là chỉ in tin nhắn. Đặt đối số tệp /dev/nulltrên UNIX hoặc NULtrên windows. Ví dụ, xem xét ghi chú của Dirk:

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

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

10
không hoạt động nếu bạn muốn áp dụng điều này để một hàm trả về một số giá trị và bạn muốn sử dụng giá trị này
TMS

8
@TMS Có điều gì thay đổi trong vài tháng qua không? Tôi chỉ thử nghiệm để sử dụng giá trị trả về bởi một hàm và nó làm việc ... capture.output(x <- log(2))và sau đó xcó giá trị log(2)...
drmariod

10

bạn có thể sử dụng 'capture.output' như bên dưới. Điều này cho phép bạn sử dụng dữ liệu sau này:

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

test$betas

9

R chỉ tự động in đầu ra của các biểu thức chưa được gán, vì vậy chỉ cần gán kết quả của biến applycho một biến, và nó sẽ không được in.


4
Một số chức năng có một print()hoặc cat()trong chúng sẽ hiển thị trên màn hình, không chuyển đến một nhiệm vụ.
keithpjolley

9

Hàm sau sẽ thực hiện chính xác những gì bạn muốn:

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

Ví dụ với chức năng ở đây:

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

đang chạy

x = hush(foo())

Sẽ gán 42 cho x nhưng sẽ không in "BAR!" đến STDOUT

Lưu ý rằng trong hệ điều hành UNIX, bạn sẽ cần thay thế "NUL" bằng "/ dev / null"


Đây là câu trả lời duy nhất làm được những gì tôi cần, được đánh giá thấp.
tomka

chính xác những gì tôi cũng cần
gaspar

3

Trong trường hợp bất kỳ ai đến đây tìm kiếm giải pháp áp dụng cho RMarkdown, điều này sẽ chặn tất cả đầu ra:

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

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


})})
```

Mã sẽ chạy, nhưng đầu ra sẽ không được in ra tài liệu HTML


1

Đưa nhận xét của Hadley thành một câu trả lời (hy vọng làm cho nó hiển thị rõ hơn). Có thể sử dụng gia đình ứng dụng mà không cần in khi sử dụng plyrgói

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

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

Được tạo vào 2020-05-19 bởi gói 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))

tạo ra đầu ra không có NULL ở cuối dòng hoặc trên dòng tiếp theo

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.