ggvis和shiny - hover属性在使用密钥添加数据时失败

时间:2014-12-12 22:43:37

标签: r shiny ggvis

我正在尝试通过调整movie explorer exmaple中的代码来学习如何一起使用ggvis和闪亮。

我遇到了一个问题,当用户的交互向图表添加新数据时,如果有密钥,则悬停效果对新数据不起作用。我希望能够保留密钥,因为我还想要一个工具提示。

下面是一个简单的例子。重现bug:
1)运行闪亮的应用程序 2)使用选择框添加“b”点 3)现在,“a”点在悬停时会按预期增加,但“b”点不会。

为了获得正确的行为,我可以在server.r中注释掉这一行,但我不想这样做(因为我要添加工具提示)。我能用反应来做所有点上的悬停行为吗?

谢谢!

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")
})

ui.r

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")
    )
  )
))

1 个答案:

答案 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;不适合你。