带R的交互式闪亮应用程序 - 将鼠标悬停在点上并显示信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带R的交互式闪亮应用程序 - 将鼠标悬停在点上并显示信息相关的知识,希望对你有一定的参考价值。

我在R工作创建一个闪亮的应用程序。

以下是我正在使用的示例数据:

data <- data.frame("name" = c("A", "A", "B", "B", "C", "C"),
                   "code_name" = c("A1", "A2", "B1", "B2", "C1", "C2"),
                   "x" = c(.13, .64, .82, .39, .51, .03),
                   "y" = c(.62, .94, .10, .24, .20, .84))

我正在尝试使用一个闪亮的应用程序,允许用户从列name中选择一个选项,显示xy值的散点图,并在您将鼠标悬停在附近时打印图表下的code_name列中的值某一点。

这是ui的代码:

library(ggplot2)
library(shiny)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "x",
                  label = "Choose a Letter:",
                  choices = levels(data$name),
                  selected = "A")
    ),
    mainPanel(
      plotOutput(outputId = "scatterplot",
                 hover = hoverOpts(id ="plot_hover")),
      verbatimTextOutput("hover_info")
    )
  )
)

这是server的代码:

server <- function(input, output) {
  output$scatterplot <- renderPlot({
    data %>%
      filter(name == input$x) %>%
      ggplot(aes(x, y)) +
      geom_point() +
      xlim(c(0, 1)) +
      ylim(c(0, 1))
    })

  output$hover_info <- renderPrint({
    if(!is.null(input$plot_hover)){
      hover = input$plot_hover
      dist = sqrt((hover$x-data$x)^2 + (hover$y-data$y)^2)
      cat("Name
")
      if(min(dist) < 3)
        data$code_name[which.min(dist)]
    }
  })
}

然后,当然:

shinyApp(ui, server)

第一个输出对象output$scatterplot可以按需运行。它是xy值的散点图,其中data$name是来自input$x的选定值。

问题出在第二个对象output$hover_info上。我想要的是renderPrint的文本框结果,只打印code_name用于data$name == input$x的观察。现在的方式,如果我从下拉菜单中选择“A”,并将鼠标悬停在其中一个绘图点上,它会正确地在该图下方打印该点的code_name。但是,如果我将鼠标悬停在两个点附近的随机点上,它将获取其他一个name选项点的位置,并显示该观测值的code_name

例如,如果您按原样运行代码(其中name == "A"是下拉列表中的默认选项),并将鼠标悬停在坐标x = 0.5,y = 0.5附近,它将在图表下方打印B2。我想避免这种情况。这里并不是什么大问题,每个名称选择只有2个数据点,但是当使用相同的框架和更大的数据集时,它会变得非常混乱。

我一直试图在filter对象中包含某种类型的output$hover_info调用,以便它只考虑通过下拉菜单定义的观察,但每次尝试时都会出错。

有任何想法吗?谢谢!

答案

我通常建议您为数据的任何类型的用户操作创建reactive对象的方法,然后在reactive调用中引用该render*对象。我发现它比在render*调用中完成所有操作更少限制,调试更容易,并且更好地理解数据的反应性应该如何工作。

在这里,我创建了一个filtered_data反应对象,它根据下拉列表进行过滤,然后进一步向下引用。您的代码无法正常工作的原因是因为您的dist计算是针对完整数据集而非过滤数据集完成的。另外,我认为你的3的门槛太宽了,所以我把它改为0.3。

最后,请注意使用qazxsw poi而不是qazxsw poi,它更干净,并且在我们希望它显示数据时更加一致。

req()

如果这符合您的要求,请告诉我。

以上是关于带R的交互式闪亮应用程序 - 将鼠标悬停在点上并显示信息的主要内容,如果未能解决你的问题,请参考以下文章

在智能手机上使用,闪亮的交互式情节无法理解手指动作

表格列的R闪亮鼠标悬停文本

将鼠标悬停在闪亮的 ggplot 上时的工具提示

将鼠标悬停在表格的 x 列上并填充 x 元素

如何使 R 闪亮图形中的模式栏永久显示?

如何将鼠标悬停在图像上并通过缓动显示文本块? [复制]