2017-10-20 11 views
10

Địa chỉ geom_density_ridges từ gói ggridges đã tạo đường thoát và nếu băng thông không được chỉ định, nó sẽ cố gắng tìm một giá trị hợp lý. Sau đó, nó sử dụng chức năng base R message để báo cáo giá trị đó (xem https://twitter.com/ClausWilke/status/921363157553172480).Tại sao ggplot không cho phép nén thông điệp được tạo ra bởi các địa lý của nó?

Chức năng base R Chức năng suppressMessages được thiết kế để chặn các thông báo như vậy. Ví dụ, mã này xuất ra một thông điệp:

message('This is a message'); 

Và đây kết quả đầu ra đang không có gì:

suppressMessages(message('This is a message')); 

Tuy nhiên, đối với một số lý do, đàn áp các thông điệp dường như, um, ức chế khi Geom này sẽ được thêm vào một ggplot. Các mã sau không vẫn tạo ra một thông điệp: (. Cụ thể, "Picking joint bandwidth of 319")

require('ggplot2'); 
require('ggridges'); 
suppressMessages(ggplot(Orange, aes(x=age,y=Tree)) + geom_density_ridges()); 

Tại sao điều này? Có ggplot làm điều gì đó để đảm bảo rằng thư đến không phụ thuộc vào đặc điểm kỹ thuật của người dùng? Hay đây là hành vi thực sự hợp lý mà tôi chỉ tình cờ không biết?

Khi tạo báo cáo RMarkdown, tùy chọn đoạn message có thể được đặt thành message=FALSE, ngăn chặn tất cả thư ở cấp hiển thị. Và vì đó là trường hợp sử dụng của tôi, vấn đề của tôi đã được giải quyết.

Và như Claus Wilke, tác giả của gói ggridges, được đề xuất, bạn luôn có thể đặt bandwidth thủ công để tránh thông báo (https://twitter.com/ClausWilke/status/921361195231215616).

Nhưng lý do tại sao không suppressMessages ngăn chặn thư ngay từ đầu?

Hành vi mong đợi này mà tôi chỉ xảy ra không biết?

+0

tôi nhận thấy trong tài liệu nó nói 'suppressMessages đánh giá biểu hiện của nó trong một bối cảnh mà bỏ qua tất cả 'đơn giản' messages.' chẩn đoán tôi tự hỏi, nếu thuật ngữ quan trọng ở đây là * đơn giản * ... – Lyngbakr

+4

Nếu bạn tự gọi 'print' thay vì để cho thông dịch viên quan tâm đến điều đó cho bạn sau đó' suppressMessages' sẽ loại bỏ các thông báo. 'suppressMessages (print (ggplot (Orange, aes (x = tuổi, y = Tree)) + geom_density_ridges()))' Tại một thời điểm tôi hiểu quá trình này tốt hơn một chút (cách thông điệp được truyền và cách suppressMessages hoạt động và tất cả điều đó) nhưng từ lâu tôi đã quên một số chi tiết nên tôi đang mong chờ một câu trả lời thực sự giải thích 'lý do'. – Dason

+4

@ Dưa tôi nghĩ bạn đã hiểu. Các thông báo không được tạo ra cho đến khi bạn gọi 'print()' trên đối tượng. Nếu bạn chỉ cần gõ một biến trong giao diện điều khiển R, R ngầm gọi 'print()' trên đối tượng đó và hiển thị kết quả. Nếu bạn chạy 'supressMessages (ggplot (...))', nó thực sự giống như 'print (supressMessages (ggplot (...)))' và không có thông báo nào được tạo ra trong quá trình xây dựng. Bạn cần 'supressMessages (in (ggplot (...)))' để tắt tiếng trong khi in. – MrFlick

Trả lời

3

Khi bạn gọi ggplot(), lệnh đó không thực sự vẽ cốt truyện - nó tạo ra đối tượng ggplot. Chỉ khi đối tượng đó được in là cốt truyện thực sự được vẽ. Khi bạn gõ một biểu thức trong giao diện điều khiển R, hành vi mặc định là gọi print() trên kết quả đó là lý do tại sao nó có vẻ như ggplot() vẽ một âm mưu.

Lưu ý rằng các cảnh báo bạn đang gặp phải không xảy ra trong quá trình tạo đối tượng ggplot; chúng xảy ra trong quá trình in của đối tượng này. Vì vậy, nếu bạn chạy

suppressMessages(ggplot(...)) 

đó là cơ bản giống như

print(suppressMessages(ggplot(...))) 

khi chạy R trong chế độ tương tác. Nhưng vì không có thư nào được tạo bởi ggplot(), không có gì bị chặn và những thư đó vẫn xuất hiện khi đối tượng kết quả được in. Để chặn các tin nhắn được tạo ra trong quá trình in, bạn cần bọc câu lệnh print() thực tế với suppressMessages().

suppressMessages(print(ggplot(...))) 
Các vấn đề liên quan