问题描述
编辑TL;DR
使用 crosstalk
包,我正在寻找一种方法将利用长格式数据(线图)的图形与具有宽格式数据的交互式表格链接起来,以便表格中的每一行对应于图中的一条线.
我正在尝试将 DT 表与绘图图链接起来。我的麻烦在于图形需要长格式的数据,而表格需要宽格式。我可能专注于 tidyverse 的做事方式。我将尝试提供一个最小的示例,说明我正在尝试做什么以及我想获得什么。
设置:
library(tidyverse)
library(crosstalk)
library(plotly)
library(DT)
# Wide format
df_test1 <- data.frame(
id = c("id1","id2"),item1 = c(0,4),item2 = c(3,2),item3 = c(1,item4 = c(3,item5 = c(1,NA)
)
# Reshaped to long format
df_test2 <-
df_test1 %>%
tidyr::pivot_longer(cols = item1:item5,names_to = "item",values_to = "value") %>%
dplyr::mutate(item = as.factor(item)) %>%
dplyr::mutate(value = factor(as.character(value),levels = c("0","1","2","3","4")))
我的尝试:
sd1 <- SharedData$new(df_test1,key = ~id)
bscols(
ggplotly(
sd1$origData() %>% # should be sd1,but returns error
# reshaping
tidyr::pivot_longer(cols = item1:item5,values_to = "value") %>%
dplyr::mutate(item = as.factor(item)) %>%
dplyr::mutate(value = factor(as.character(value),"4"))) %>%
# ploting
ggplot(.,aes(x = value,y = item,group = id)) +
geom_path() +
geom_point(aes(color = value),size = 3) +
scale_x_discrete(position = "top",limits = c("0","4")),tooltip = c("x","y","group"),height = 600,width = 300),datatable(sd1)
)
当然,这只是因为我使用了 sd1$origData()
而不是串扰功能所需的 sd1
才给出输出。使用 sd1
会引发错误,因为 tidyverse 动词不适用于 R6 串扰对象。无论如何,这提供了所需的图形和表格输出,但没有串扰功能。
我希望得到的:
sd2 <- SharedData$new(df_test2,key = ~id)
bscols(
ggplotly(
# ploting
ggplot(sd2,group = id)) +
geom_path() +
geom_point(aes(color = value),size = 3) +
scale_x_discrete(position = "top",datatable(sd2)
)
这适用于我想要的串扰功能的最小示例,但我需要 DT::datatable
中的数据为宽格式。在示例中,点和路径(标记和轨迹)需要链接到 id
,它对于宽格式的每一行应该是唯一的。另外,我希望找到一个解决方案,在用户单击所需的表格行之前,所有点和路径都将不可见。
我猜我在这方面走错了路,可能需要做一些我没有想到的事情。我现在读到,在 2021 年,plotly API 可以使用 wide data
格式化,但还没有找到任何示例说明如何在 R 中实现这一点。
任何帮助将不胜感激。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)