Вызов ggplot в функции с NSE

Идея состоит в том, чтобы исправить вызов ggplot в функции.

Пример:

library(dplyr)
library(ggplot2)
library(lazyeval)

df <- data.frame(A=letters[1:10], B=2:11, C=3:12))

func <- function(name, dat=df) {

  output <- dat %>%
    select_(~A,name) %>%
    arrange_(interp(~desc(var), var=as.name(name)))

  plot <- 
    ggplot(output, aes_string(x=reorder(~A,-name), y=B)) +
    geom_bar(stat='identity')

  print(plot)
  return(plot)

}

result <- func("B")

Компиляция дает:

Ошибка в -name: неверный аргумент для унарного оператора.

Я старался deparse а также substitute, Не уверен, что получил правильную комбинацию. Есть идеи?

1 ответ

Решение

Изменить порядок данных перед их передачей ggplot, Следующий код также перемещает некоторые имена столбцов в ggplot звоните, потому что в противном случае вы всегда будете заговор A против B, независимо от name аргумент - или это было намеренно?

function (dat, name) {
    var = as.name(name)
    reord = list(interp(~ reorder(var, -var), var = var))
    output = dat %>%
        select_(~A, name) %>% # Not actually necessary.
        arrange_(interp(~ desc(var), var = var)) %>%
        mutate_(.dots = setNames(reord, name))

    plot = ggplot(output, aes_string(x = 'A', y = name)) +
        geom_bar(stat = 'identity')

    plot(plot)
    plot
}

func(df, 'B')

Я использую mutate_(.dots = …) Форма здесь. Взгляните на виньетку dplyr "NSE" для получения дополнительной информации об ее использовании.

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