подавить сообщения с возвратом вместо печати в R? - PullRequest
2 голосов
/ 04 октября 2019

У меня есть пакет, в котором есть набор функций, которые генерируют объекты ggplot2. Недавно ggplot2 добавил обновление, которое выдает сообщение:

`geom_smooth()` using method = 'loess' and formula 'y ~ x'

Я знаю, почему ggplot2 так говорит, но мне не нужно слышать это каждый раз, когда я запускаюзаговор (и это смущает моих пользователей, потому что они думают, что сделали что-то не так). Я знаю, что могу подавить сообщения, заключив оператор печати в suppressMessages, но я не хочу print сюжет, я хочу return его. Если я print это, он будет отображать график, даже если я не хочу отображать его.

Есть идеи? Вот минимальный рабочий пример.

f = function(y,x,data){
    p = ggplot(data, aes_string(x,y)) + geom_point() + geom_smooth(se=F)
    #suppressMessages(return(p))    ### doesn't work
    suppressMessages(print(p))      ### works, but I don't want to PRINT it
}
data(iris)
head(iris)
f("Sepal.Length", "Sepal.Width", iris)

1 Ответ

4 голосов
/ 04 октября 2019

Вы можете просто установить method = 'loess' вместо method = 'auto', что является значением по умолчанию:

library(ggplot2)
f = function(y,x,data){
  p = ggplot(data, aes_string(x,y)) + geom_point() + geom_smooth(method = "loess")
  return(p)
}

data(iris)

gg <- f("Sepal.Length", "Sepal.Width", iris)
gg

Создано в 2019-10-04 представительный пакет (v0.3.0)

Я не вижу здесь сообщения, даже короткого.

Другим вариантом является определение пользовательской функции печати и предоставление вашему выходному объекту другого класса:

f = function(y,x,data){
  p = ggplot(data, aes_string(x,y)) + geom_point() + geom_smooth()
  class(p) <- c("gg_silent", class(p))
  return(p)
}

print.gg_silent <- function(gg) {
  suppressMessages(ggplot2:::print.ggplot(gg))
}

Это будет подавлять сообщения при печати возвращенного объекта. Поскольку это добавляет класс, а не перезаписывает старый, вы все равно можете добавить аргументы с + без проблем. Тем не менее, я бы сказал, что первый вариант должен быть лучшим.

...