Непрерывная переменная X используется, но все еще получает ошибку: StatBin требует непрерывной переменной x - PullRequest
0 голосов
/ 20 февраля 2020

Я создаю функцию, которая использует forl oop для создания и возврата списка ggplots. Когда я пытаюсь просмотреть любой из возвращенных графиков, например, вызывая plots["aClass_20_30"], я получаю:

Ошибка: StatBin требует непрерывной переменной x: переменная x является дискретной. Возможно, вы хотите stat = "count"?

Однако, если я создам один из графиков за пределами forl oop, как показано ниже, он будет отображаться просто отлично, потому что рассматриваемая переменная myVar, IS непрерывный:

tpp %>%
  filter(risk_class == "aClass", age_buckets=="20_30") %>% 
  ggplot(aes(x=myVar)) +
  geom_area(stat='bin') +
  labs(title = paste("aClass", "20_30", sep="_"))

Это функция:

plot_fixed_age_class_against <- function(variable) {

  temp <- tpp %>% 
    select_('age_buckets', 'rclass', variable) %>% 
    filter(!is.na(rclass))

  plots <- vector("list", 48)

  for (class in unique(temp$rclass)) {
    for (age in unique(temp$age_buckets)) {

      print(paste(class, age, sep="_"))

      plots[[paste(class, age, sep="_")]] <- 
        temp %>%
        filter(rclass == class, age_buckets==age) %>% 
        ggplot(aes(x=variable)) +
          geom_area(stat='bin') +
          labs(title = paste(class, age, sep="_"))
    }
  }
  #print(plots)

  return(plots)
}

, и я вызываю ее, используя plots <- plot_fixed_age_class_against("myVar")

Если я изменяю bin для подсчета в пределах forl oop, графики отображаются, но на них ничего не изображено. Однако использование bin вне forl oop, как указано выше, работает отлично. myVar - это число c.

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

С новой версией tidyverse aes_string станет устаревшим. Вместо этого мы можем использовать rlang::sym для преобразования в символ и затем оценивать

library(ggplot2)
f <- function(var) {
   ggplot(mtcars, aes(!! rlang::sym(var))) +
   geom_histogram()
     }


f("cyl")

Кроме того, если мы передаем либо в кавычках, либо в кавычках, одним из вариантов является использование ensym

f <- function(var) {
   ggplot(mtcars, aes(!! rlang::ensym(var))) +
   geom_histogram()
     }

f("cyl")
f(cyl)
1 голос
/ 20 февраля 2020

Вы можете использовать aes_string, чтобы заставить ggplot2 хорошо играть со строковыми аргументами:

library(ggplot2)

f <- function(var) {
  ggplot(mtcars, aes(var)) +
    geom_histogram()
}


f("cyl")

Вызывает эту ошибку:

Error: StatBin requires a continuous x variable: the x variable is discrete. Perhaps you want stat="count"?

Но если мы используем ggplot2 s, альтернативный в NSE, aes_string:

f <- function(var) {
  ggplot(mtcars, aes_string(var)) +
    geom_histogram()
}


f("cyl")

Сюжет составлен без ошибок.

Редактировать:

Спасибо @akrun за напоминание, что aes_string et c амортизируются мягко.

Согласно документам ggplot2 это это одна из предложенных tidyverse альтернатив aes_string:

Но если мы используем ggplot2 s альтернативу NSE, aes_string:

  f <- function(var) {

    var <- enquo(var)

    ggplot(mtcars, aes(!!var)) +
      geom_histogram()
  }


  f(cyl)
...