2012-01-12 52 views
6

Tôi đang gọi hàm R từ gói R e1071 được giao tiếp với libsvm (chương trình C). Chức năng này đang truyền thông báo cảnh báo C (printf) đến bàn điều khiển R. Tôi biết điều này vì các thông báo cảnh báo có dạng (cảnh báo: ...) trong khi các thông báo cảnh báo R được viết hoa (tức là Cảnh báo: ...).Loại bỏ thông báo cảnh báo C trong R

Tôi đã thử mọi thứ để loại bỏ các thông báo này trong R (chìm, triệt tiêuWarnings, vô hình) nhưng không có gì có vẻ hoạt động.

Bất kỳ ý tưởng nào?

Cảm ơn!

+0

Tại sao quá mơ hồ? Bạn đang giao tiếp với libsvm thông qua một gói R? Hay bạn đang làm việc trên một cái gì đó tùy chỉnh? GCC là một trình biên dịch, tôi nghi ngờ cảnh báo thời gian chạy đến từ nó, nhiều khả năng chúng là printfs trong mã libsvm C. – Mark

+0

gói eep71 yep - Tôi nghĩ bạn nói đúng, các tin nhắn đến từ bản in. Tôi có cần phải đi vào mã C và xóa nó? hoặc có cái gì tôi có thể làm từ R? – Michael

+0

Tôi cũng không nhớ đã cài đặt libsvm trên máy tính của mình chưa, tôi vừa tải xuống gói R. Điều đó có nghĩa là mã nguồn libsvm nằm trong gói R? – Michael

Trả lời

9

Chức năng sử dụng stdio thay vì Rprintf/REprintf hoặc warning đó là lý do tại sao lại hướng đầu ra R sẽ không hoạt động. Giải pháp thích hợp là sửa các cuộc gọi trong số libsvm để sử dụng đầu ra R thay thế.

Có thể xuất hiện sản phẩm stdio - bạn có thể chuyển hướng đầu ra đến đường ống của riêng mình và thực hiện theo ý mình, nhưng a) công việc trong C và b) rất nguy hiểm vì bạn cần để khôi phục lại hành vi tiêu chuẩn sau khi bạn đã hoàn thành với hàm - ngay cả khi nó bị lỗi và c) có thể tương tác với đầu ra R nếu được sử dụng trên một trình bao.

Nếu bạn muốn có một, bẩn giải pháp được nêu nhanh chóng thực sự whacky, chạy chức năng của bạn trong collect(parallel(..., silent=TRUE))[[1]] từ multicore - nó ngăn chặn stdout (bạn có thể thêm multicore:::closeStderr() nếu bạn muốn ngăn chặn stderr cũng).

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