我正在尝试通过调整movie explorer exmaple中的代码来学习如何一起使用ggvis和闪亮。
我遇到了一个问题,当用户的交互向图表添加新数据时,如果有密钥,则悬停效果对新数据不起作用。我希望能够保留密钥,因为我还想要一个工具提示。
下面是一个简单的例子。重现bug:
1)运行闪亮的应用程序
2)使用选择框添加“b”点
3)现在,“a”点在悬停时会按预期增加,但“b”点不会。
为了获得正确的行为,我可以在server.r
中注释掉这一行,但我不想这样做(因为我要添加工具提示)。我能用反应来做所有点上的悬停行为吗?
谢谢!
library(ggvis)
# Set up data on app start
all_data <- data.frame(x=1:4, y=1:4, z=c("a", "b", "b", "a"), ID=1:4)
shinyServer(function(input, output, session) {
# Filter the data
this_data <- reactive({
all_data[all_data$z %in% input$z, ]
})
# A reactive expression with the ggvis plot
vis <- reactive({
this_data %>%
ggvis(~x, ~y) %>%
layer_points(fill = ~z,
key := ~ID, # Comment out this line for proper behavior
size := 50, size.hover := 500,
fillOpacity := 0.9, fillOpacity.hover := 0.5)
})
vis %>% bind_shiny("plot1")
})
library(ggvis)
shinyUI(fluidPage(
titlePanel("Example"),
fluidRow(
column(3,
wellPanel(
selectInput("z", "Select Z", c("a", "b"),
selected = "a", multiple=TRUE)
)
),
column(9,
ggvisOutput("plot1")
)
)
))
答案 0 :(得分:1)
这让我非常困惑。我可以用一堆奇怪的方式复制它 - 例如添加组/添加点。您添加组并删除它们的顺序也很奇怪。
在我在电影示例之后创建的一个我自己的闪亮/ ggvis图中,我遇到了类似的密钥/ ID问题,我发现在所有数据过滤后添加ID效果更好。我在这里尝试通过在过滤后添加ID变量,但它仍然没有工作。但是,将它添加到新的反应中就可以了。
这是我的ggvis / shiny,我必须做类似的事情 - https://jalapic.shinyapps.io/cricket 和原始代码 - https://github.com/jalapic/shinyapps/blob/master/cricket/server.R
我认为这很有效 - 至少对我而言。实际上,请注意我从数据设置中删除了ID。然后,我在第一个被动反应中完成过滤后,将其添加到新的反应中。
# Set up data on app start
all_data <- data.frame(x=c(1,3:5), y=1:4, z=c("a", "b", "b", "a"))
shinyServer(function(input, output, session) {
# Filter the data
this_data <- reactive({
all_data[all_data$z %in% input$z, ]
})
this_data1 <- reactive({
as.data.frame(this_data() ) %>% mutate(ID = row_number(x))
})
# A reactive expression with the ggvis plot
vis <- reactive({
this_data1 %>%
ggvis(~x, ~y) %>%
layer_points(fill = ~z,
key := ~ID, # Comment out this line for proper behavior
size := 50, size.hover := 500,
fillOpacity := 0.9, fillOpacity.hover := 0.5)
})
vis %>% bind_shiny("plot1")
})
dplyr
的%&gt;%mutate(row_number())命令添加了ID变量,但我确定如果不这样做,你可以用另一种方式来做这个&# 39;不适合你。