Как создать многоразовую функцию plot_ly? - PullRequest
1 голос
/ 16 января 2020

Я смотрю на набор данных с tidytuesday, доступный здесь:

video_games <- readr::read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-07-30/video_games.csv")

Я написал этот код для создания горизонтальной линейчатой ​​диаграммы, ранжированной в порядке убывания.

video_games %>% 
  top_n(10, metascore) %>% 
  arrange(desc(metascore)) %>% 
  plot_ly(x = ~metascore, y = ~fct_reorder(game, metascore), 
          type = "bar") %>% 
  layout(xaxis = list(title = "Metascore"),
         yaxis = list(title = ""))

Я хочу повторно использовать код с несколькими переменными без копирования и вставки, поэтому я создал функцию с 2 записями для переменных, которые я хочу построить. (Я пропустил раздел макета. Если есть способ автоматически включить график внутри функции, это было бы здорово.)

video_games_ranking_plot <- function(A, B) {
  top_n(10, A) %>% 
    arrange(desc(A)) %>% 
    plot_ly(x = ~A, y = ~fct_reorder(B, A), 
            type = "bar")
}

Когда я запускаю функцию

video_games %>%           
video_games_ranking_plot(metascore, game)

... Я получаю сообщение об ошибке Error in video_games_ranking_plot(., metascore, game) : unused argument (game)

Кто-нибудь знает почему?

1 Ответ

1 голос
/ 16 января 2020

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

  1. top_n(10, metascore)
  2. arrange(desc(metascore)
  3. plot_ly(x = ~metascore, y = ~fct_reorder(game, metascore)

Тот факт, что вы Также передаются столбцы, поскольку аргументы с использованием трубопровода также могут создавать определенные проблемы. Я не нашел времени для создания полного решения, но, надеюсь, это поможет вам на пути к завершенному решению:

Сюжет:

enter image description here

Код:

library(dplyr)
library(forcats)
library(plotly)

# get data
video_games <- readr::read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-07-30/video_games.csv")

data <- video_games

# custom function
video_games_ranking_plot <- function(data, topn, col_top, col_ord){

  # select and arrand data
  df <- data %>% top_n(topn, {{col_top}}) %>% arrange(desc({{col_ord}})) #%>%

  col_top_name <- deparse(substitute(col_top))
  col_ord_name <- deparse(substitute(col_ord))
  df2<- df[c(col_top_name, col_ord_name)]

  # build plotly pliot
  p <- plot_ly(x = df2[[col_top_name]], y = df2[[col_ord_name]], type = "bar")


}

plt <- video_games_ranking_plot(data=video_games, topn=5, metascore, game)  

plt

Все еще существует проблема с частью ~fct_reorder(game, metascore). Я должен был поднять вопрос сам, чтобы даже пойти так далеко. Взгляните на ответ пользователя Ronak Shah на пост Как передать столбец dataframe в качестве аргумента функции, использующей конвейер? , чтобы узнать больше о том, как передавать аргументы функциям конвейера.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...