2012-01-10 42 views
15

Nhiều gói R tôi làm việc với các hàm liên quan cung cấp tất cả thông điệp và cảnh báo của chúng qua lệnh để in() gọi thay vì lệnh để nhắn tin() hoặc cảnh báo(). Tôi muốn có thể tắt tiếng các chỉ báo tiến trình chức năng này, v.v., nhưng supressWarnings tiêu chuẩn() hoặc supressMessages không làm điều đó. Có cách nào tôi chỉ có thể ngăn chặnPrint?chặn thông điệp được hiển thị bằng "in" thay vì "tin nhắn" hoặc "cảnh báo" trong R

Ví dụ:

silly_developer_function <- function(x){ 
    print("Thanks for using my function!!") 
    if(is(x, "numeric")) 
    print("warning, x should be a character") 
    x 
} 

Tôi muốn có một hàm suppressPrint đơn giản() mà tôi có thể quấn quanh một cuộc gọi đến chức năng này sẽ ngăn chặn các thông điệp cảnh báo và vô dụng (nhưng vẫn in sự trở lại giá trị).

+0

Có chiến lược hackish sử dụng 'sink', nhưng có thể có cách tốt hơn. – joran

+0

@cboettig - Bản chỉnh sửa được đề xuất của bạn về giải pháp của Simon rất hay, nhưng tốt hơn nên được thêm vào như một bản chỉnh sửa/phụ lục cho bài đăng của riêng bạn. Cảm ơn. –

+0

@ JoshO'Brien Cảm ơn con trỏ. Tôi có phải chỉnh sửa câu hỏi ban đầu của tôi với đề xuất đó không? Có vẻ lạ khi chuyển câu hỏi thành câu trả lời? – cboettig

Trả lời

25

Vâng, các gói đó có lỗi để bắt đầu. Sử dụng print() cho bất kỳ điều gì ngoài tác dụng phụ trong việc triển khai print là một sai lầm nghiêm trọng.

Điều đó nói rằng, bạn chỉ cần sử dụng capture.output() để thu thập đầu ra từ mã như vậy thay vì in. Vì vậy, đối với phần trên, nó sẽ là

capture.output(x <- silly_developer_function(...)) 
print(x) 
+0

Giải pháp tuyệt vời. Tôi có thể chỉ định đầu ra của capture.output để tránh in. Đồng ý rằng đây là một công việc xung quanh mã lỗi, nhưng việc sử dụng in thay vì thông điệp() là tràn lan trong các gói tôi sử dụng để giải pháp của bạn khá tiện dụng! – cboettig

+1

FWIW nếu bạn lo lắng về đầu ra trên bàn điều khiển (tự động thêm 'print (..)', bạn có thể quấn 'capture.output' trong' invisible (...) ' –

+0

Cảm ơn, điều đó rất hữu ích. Tôi gặp phải vấn đề này bằng cách viết các họa tiết Sweave lặp lại trên một số chức năng như vậy, và Sweave/knitr cũng tự động thêm in. Lý tưởng nhất điều này có thể được kìm nén trong Sweave tùy chọn cách thông điệp và cảnh báo có thể. – cboettig

0

Cách hack khác là ghi đè hàm mặc định print. Nó sẽ ảnh hưởng đến một số chức năng, chẳng hạn như in cơ thể của các hàm, nhưng các đối tượng với các phương thức in của riêng chúng vẫn được trả lại như bình thường.

print <- function(...) {} 

> silly_developer_function("a") 
[1] "a" 
> silly_developer_function(1) 
[1] 1 
+0

Điều đó sẽ không hoạt động nói chung, bởi vì các gói không nhất thiết phải sử dụng không gian tên chung để tra cứu hàm. –

+0

@SimonUrbanek Ah, đúng vậy – James

Các vấn đề liên quan