[英]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
传递给接受不同类型参数的自定义函数的非常不同的元素:
top_n(10, metascore)
arrange(desc(metascore)
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.