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à apply
hà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ể.
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à apply
hà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ể.
capture.output
. Hoặc sử dụng *_ply
từ gói plyr.
lapply
củ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ừ plyr
gói của anh ấy có lẽ là lựa chọn thích hợp nhất.
Câu trả lời:
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(); }
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.
apply
, theo câu hỏi: invisible(apply(matrix(1:10), 1, as.numeric))
.
{ sink("/dev/null"); ....; sink(); }
tôi chắc chắn muốn capture.output
, như capture.output
hiệ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ó).
idw
chức năng của Windows. Tôi nghĩ rằng giải pháp tốt nhất là sử dụngsink
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/null
trên UNIX hoặc NUL
trên windows. Ví dụ, xem xét ghi chú của Dirk:
> invisible(cat("Hi\n"))
Hi
> capture.output( cat("Hi\n"), file='NUL')
>
capture.output(x <- log(2))
và sau đó x
có giá trị log(2)
...
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 apply
cho một biến, và nó sẽ không được in.
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ụ.
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"
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
Đư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 plyr
gó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)
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