我正在查看 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)
...我收到错误消息 video_games_ranking_plot(., metascore, game) 中的错误:
未使用的参数(游戏)
有谁知道为什么吗?
最佳答案
问题的根源似乎是您将一种类型的相同参数metascore, game
传递给接受以下参数的自定义函数的非常不同的元素不同类型:
top_n(10, 元分数)
排列(desc(metascore)
plot_ly(x = ~metascore, y = ~fct_reorder(游戏, metascore)
事实上,您还使用管道传递列 ase 参数,这也会带来某些挑战。我还没有时间构建完整的解决方案,但希望这将帮助您获得完整的解决方案:
plotly :
代码:
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 piping? 的回答了解有关如何将参数传递给管道函数的更多信息。
希望这会有所帮助!
关于r - 如何创建可重用的plot_ly函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59764372/