繁体   English   中英

如何创建可重用的 plot_ly 函数?

[英]How to create a reusable plot_ly function?

我正在查看 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)

有谁知道为什么?

问题的根源似乎是您将相同的参数metascore, game一种类型的metascore, game传递给接受不同类型参数的自定义函数的非常不同的元素:

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

您还使用管道传递列 ase 参数这一事实也可能带来某些挑战。 我还没有找到时间来构建一个完整的解决方案,但希望这会帮助你找到一个完整的解决方案:

阴谋:

在此处输入图片说明

代码:

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 对How to pass a dataframe column as an argument in a function using pipe?的回答 了解有关如何将参数传递给管道函数的更多信息。

我希望这有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM