Как правильно написать функцию, показывающую гистограмму «порядка величины»?

На основе ответов здесь и здесь я создал свою функцию. Поскольку в hist могут встречаться нули, я думаю, что это должна быть новая функция.

Начнем (если я заменю последнюю строку на plot(h), предупреждения пропадут, но я не уверен, действительно ли отображается гистограмма с правильными параметрами из ...):

order_of_magnitude_hist <- function(x, ylog = FALSE, ...) {
  params <- list(...)
  optionalParamNames <- c(
    "breaks", "freq", "probability", "include.lowest", "right", "density", 
    "angle", "col", "border", "main", "xlim", "ylim", "xlab", "ylab", "axes", 
    "plot", "labels", "nclass", "warn.unused")
  unusedParams <- setdiff(names(params),optionalParamNames)
  if (length(unusedParams)) {
    stop('unused parameters ',paste(unusedParams,collapse = ', '))
  }
  
  if ("breaks" %in% names(params)) {
    h <- hist(x, breaks = params$breaks, plot = FALSE)
  } else {
    h <- hist(x, plot = FALSE, ...)
  }
  assertthat::assert_that(all(h$counts >= 0))
  
  if (!ylog) {
    h$counts[h$counts == 0] <- 0
    h$counts[h$counts %in% c(1:9)] <- 1
    h$counts[h$counts %in% c(10:99)] <- 2
    h$counts[h$counts %in% c(100:999)] <- 3
    h$counts[h$counts %in% c(1000:9999)] <- 4
    h$counts[h$counts %in% c(10000:99999)] <- 5
  } else {
    h$counts[h$counts == 0] <- 0
    h$counts[h$counts == 1] <- 1
    h$counts[h$counts > 1] <- log10(h$counts[h$counts > 1])
  }
  plot(h, ...)
}

set.seed(1)
dt <- 1/runif (n = 1000, min = 0.0001, max = 10)
order_of_magnitude_hist(dt, 
                        breaks = seq(min(dt), max(dt), length.out = 101), 
                        main = "Title 1")
order_of_magnitude_hist(dt, 
                        breaks = seq(min(dt), max(dt), length.out = 101), 
                        ylog = TRUE,
                        main = "title 2")

В принципе выглядит нормально, но появляются следующие предупреждения:

Warning messages:
1: In plot.window(xlim, ylim, "", ...) : "breaks" ist kein Grafikparameter
2: In title(main = main, sub = sub, xlab = xlab, ylab = ylab, ...) :
  "breaks" ist kein Grafikparameter
3: In axis(1, ...) : "breaks" ist kein Grafikparameter
4: In axis(2, ...) : "breaks" ist kein Grafikparameter
...
1: In doTryCatch(return(expr), name, parentenv, handler) :
  "breaks" ist kein Grafikparameter

Предупреждение имеет смысл для меня, но я понятия не имею, как решить проблему.

Любые идеи?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предупреждающее сообщение появляется при вызове plot(h,...). Поскольку h относится к классу "histogram", plot() вызывает graphics:::plot.histogram(), у которого нет аргумента breaks. Ожидается, что разрывы уже будут внутри аргумента x, который относится к классу "histogram".

Если вы хотите избавиться от этих предупреждений, я бы рекомендовал передавать только те параметры, которые допустимы для функции graphics:::plot.histogram(). См. valid_plotting_parameters и my_plotting_parameters ниже.

Однако при таком подходе вы можете потерять другие графические параметры, содержащиеся в аргументе ... функции order_of_magnitude_hist(). Конечно, вы можете вручную увеличить valid_plotting_parameters до всех параметров, которые хотите передать graphics:::plot.histogram().

order_of_magnitude_hist <- function(x, ylog = FALSE, ...) {
  params <- list(...)
  optionalParamNames <- c(
    "breaks", "freq", "probability", "include.lowest", "right", "density", 
    "angle", "col", "border", "main", "xlim", "ylim", "xlab", "ylab", "axes", 
    "plot", "labels", "nclass", "warn.unused")
  unusedParams <- setdiff(names(params),optionalParamNames)
  if (length(unusedParams)) {
    stop('unused parameters ',paste(unusedParams,collapse = ', '))
  }
  
  if ("breaks" %in% names(params)) {
    h <- hist(x, breaks = params$breaks, plot = FALSE)
  } else {
    h <- hist(x, plot = FALSE, ...)
  }
  assertthat::assert_that(all(h$counts >= 0))
  
  if (!ylog) {
    h$counts[h$counts == 0] <- 0
    h$counts[h$counts %in% c(1:9)] <- 1
    h$counts[h$counts %in% c(10:99)] <- 2
    h$counts[h$counts %in% c(100:999)] <- 3
    h$counts[h$counts %in% c(1000:9999)] <- 4
    h$counts[h$counts %in% c(10000:99999)] <- 5
  } else {
    h$counts[h$counts == 0] <- 0
    h$counts[h$counts == 1] <- 1
    h$counts[h$counts > 1] <- log10(h$counts[h$counts > 1])
  }
  # plot(h, ...)
  valid_plotting_parameters <- c(
    "freq", "density", "angle", "col", "border", "lty", "main", "sub", "xlab",
    "ylab", "xlim", "ylim", "axes", "labels", "add", "ann")
  my_plotting_parameters <- params[names(params) %in% valid_plotting_parameters]
  do.call(what = "plot", 
          args = append(list(x = h), my_plotting_parameters))
}

set.seed(1)
dt <- 1/runif (n = 1000, min = 0.0001, max = 10)
order_of_magnitude_hist(dt, 
                        breaks = seq(min(dt), max(dt), length.out = 101), 
                        main = "Title 1")
order_of_magnitude_hist(dt, 
                        breaks = seq(min(dt), max(dt), length.out = 101), 
                        ylog = TRUE,
                        main = "title 2")

Другие вопросы по теме

Похожие вопросы

Изменение порядка категорий легенды сюжета на карте terra SpatVector
Как получить верхний индекс в tinytex data.table()
Создавайте пользовательские метки в Leaflet Legend
Как изменить параметры sys.time по умолчанию?
Какую функцию можно использовать для завершения и заполнения отсутствующих наблюдений временного ряда, избегая завершения до даты начала ряда?
Печать имени результата над выводом coxph и возведением в степень коэффициентов (версия R 4.1.2 (2021-11-01) -- "Bird Hippie")
Идиоматический dplyr и/или способ data.table получить групповые средние и общие средние "идиоматически" за один шаг
Как указать индекс столбца для изменения с помощью dplyr, когда размер таблицы является переменным?
Есть ли в R функция, с помощью которой я могу напечатать единственный уникальный элемент в строке?
Пространственные операции: как буферизовать полигон по площади, а не по расстоянию (от края)