R 在Shiny中创建悬停信息框和反应下拉菜单

R 在Shiny中创建悬停信息框和反应下拉菜单,r,ggplot2,shiny,R,Ggplot2,Shiny,这是我的第一个闪亮的应用程序,我刚刚获得了一些基础知识,它允许用户从客户端的下拉菜单中进行选择,然后从测试代码的下拉菜单中接收所选测试的结果图 我希望第二个下拉菜单用该客户机的可用测试代码更新(每个客户机都不存在)。此外,我希望能够将鼠标悬停在绘图中的点上,并从原始数据框中的行接收更多信息 我已经研究了工具提示和nearPoints()函数,但我不确定这些是否可以用于此数据,因为它是被操纵的。我不确定在这一点上,以不同的方式导入数据是否会更容易(最终需要接受excel文件或.csv)。谢谢你能提

这是我的第一个闪亮的应用程序,我刚刚获得了一些基础知识,它允许用户从客户端的下拉菜单中进行选择,然后从测试代码的下拉菜单中接收所选测试的结果图

我希望第二个下拉菜单用该客户机的可用测试代码更新(每个客户机都不存在)。此外,我希望能够将鼠标悬停在绘图中的点上,并从原始数据框中的行接收更多信息

我已经研究了工具提示和nearPoints()函数,但我不确定这些是否可以用于此数据,因为它是被操纵的。我不确定在这一点上,以不同的方式导入数据是否会更容易(最终需要接受excel文件或.csv)。谢谢你能提供的任何帮助,如果我能提供任何其他支持信息,请告诉我

这是我的密码:

library(shiny)
library(scales)
library(ggplot2)

labData <- 
read.table("MockNLData.csv", 
header=TRUE, sep=",")

#convert '<10' and '<20' results
labData$ModResult <- labData$Result
levels(labData$ModResult)[levels(labData$ModResult)=="<10"] 
<- "0"
levels(labData$ModResult)[levels(labData$ModResult)=="<20"] 
<- "0"
#convert results to scientific notation
SciNotResult <- 
formatC(as.numeric(as.character(labData$ModResult)), 
format="e", digits=2)

ui <- fluidPage(
  headerPanel("Dilution History"), 
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId="client", label="Select Client 
Name", choices=levels(labData$Client.Name)
      ),
      selectInput(inputId="test", label="Select Test Code", 
choices=levels(labData$Analysis))
      ),
    mainPanel(
      plotOutput("line", hover="plot_hov"),
  verbatimTextOutput("info"))
    )
   )

server <- function(input, output) {
#selected client into data frame
selDF <- reactive({labData[labData[,1]==input$client,]
   })

#selected test code into data frame
subsetDF <- reactive({selDF()[selDF()[,5]==input$test,]
  })

#points to be plotted
points <- 
reactive({as.numeric(levels(subsetDF()$ModResult)) 
[subsetDF()$ModResult]
  })

#plot
  output$line <- renderPlot({
    qplot(seq_along(points()), points(), xlab ="Index", 
ylab ="Result")
  })

#hover information  
   output$info <- renderText({
   paste0("x=", input$plot_hov$x, "\ny=", 
input$plot_hov$y)
  })
}

shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(比例尺)
图书馆(GG2)

labData今后,请确保共享一个可复制的示例:)

由于您的代码不可复制,请在下面找到一些您可以理解并适应您的情况的内容

关于第一个问题,如果我理解正确,您希望通过编程生成一个下拉列表(
selectInput
),这是完全可以做到的<代码>*输入
s本质上就是HTML内容,您可以动态生成这些内容,就像您的绘图一样。您可以使用
uiOutput
(在您的ui中)和服务器中的
renderUI
执行此操作

library(shiny)

ui <- fluidPage(
  selectInput("dataset", "Select a dataset", choices = c("cars", "mtcars")),
  uiOutput("column"), # dynamic column selector
  verbatimTextOutput("selected_column")

)

server <- function(input, output, session){

  data <- reactive({
    if(input$dataset == "cars")
      return(cars)
    else
      return(mtcars)
  })

  output$column <- renderUI({
    # build your selectInput as you normally would
    selectInput("column_selector", "Select a column", choices = colnames(data()))
  })

  output$selected_column <- renderPrint({
    # use input$column_selector!
    print(input$column_selector)
  })

}

shinyApp(ui, server)
编辑

下面是关于闪烁错误的问题。您需要(
req
)所需的输入。当启动下面的应用程序时,错误将闪烁,取消注释
req(输入$y)
行,它将消失

library(shiny)

ui <- fluidPage(
    uiOutput("sel"),
    plotOutput("plot")
)

server <- function(input, output){
    output$sel <- renderUI({
        numericInput("y", "N:", value = 200, min = 5, max = 1000, step = 100)
    })

    output$plot <- renderPlot({
        # req(input$y)
        hist(runif(input$y, 1, 10))
    })
}

shinyApp(ui, server)
库(闪亮)

ui以后,请确保共享一个可复制的示例:)

由于您的代码不可复制,请在下面找到一些您可以理解并适应您的情况的内容

关于第一个问题,如果我理解正确,您希望通过编程生成一个下拉列表(
selectInput
),这是完全可以做到的<代码>*输入
s本质上就是HTML内容,您可以动态生成这些内容,就像您的绘图一样。您可以使用
uiOutput
(在您的ui中)和服务器中的
renderUI
执行此操作

library(shiny)

ui <- fluidPage(
  selectInput("dataset", "Select a dataset", choices = c("cars", "mtcars")),
  uiOutput("column"), # dynamic column selector
  verbatimTextOutput("selected_column")

)

server <- function(input, output, session){

  data <- reactive({
    if(input$dataset == "cars")
      return(cars)
    else
      return(mtcars)
  })

  output$column <- renderUI({
    # build your selectInput as you normally would
    selectInput("column_selector", "Select a column", choices = colnames(data()))
  })

  output$selected_column <- renderPrint({
    # use input$column_selector!
    print(input$column_selector)
  })

}

shinyApp(ui, server)
编辑

下面是关于闪烁错误的问题。您需要(
req
)所需的输入。当启动下面的应用程序时,错误将闪烁,取消注释
req(输入$y)
行,它将消失

library(shiny)

ui <- fluidPage(
    uiOutput("sel"),
    plotOutput("plot")
)

server <- function(input, output){
    output$sel <- renderUI({
        numericInput("y", "N:", value = 200, min = 5, max = 1000, step = 100)
    })

    output$plot <- renderPlot({
        # req(input$y)
        hist(runif(input$y, 1, 10))
    })
}

shinyApp(ui, server)
库(闪亮)

ui我从您的上述问题中了解到:

  • 您希望根据用户从上一个下拉菜单中选择的内容创建下一个下拉菜单
  • 当鼠标悬停在绘图点上时,将显示行值
  • 所以,这里我将给你们一个可复制的例子,我希望它对你们有用

    • 在本例中,我使用了库MASS中的Rabbit数据集
    • 要为下一个下拉菜单过滤数据,我使用库中的过滤器 dplyr(参见第30行)
    • 我使用反应式表达式管理下一个下拉菜单(参见第行) 29)
    • 我使用nearPoints()来管理悬停点(参见第55行)
    库(闪亮)
    图书馆(弥撒)
    图书馆(dplyr)
    图书馆(GG2)
    ui%选择(运行)
    })
    输出$selected_var1%filter(治疗==输入$var1)%>%filter(运行==输入$var2),aes(x=BPchange,y=Dose))+geom_point()
    })
    ###使用nearPoints()悬停点
    输出$info%filter(动物==输入$var)%%>%filter(治疗==输入$var1)%%>%filter(运行==输入$var2),输入$plot\u悬停)
    })
    }
    shinyApp(用户界面=用户界面,服务器=服务器)
    
    我从您的上述问题中了解到:

  • 您希望根据用户从上一个下拉菜单中选择的内容创建下一个下拉菜单
  • 当鼠标悬停在绘图点上时,将显示行值
  • 所以,这里我将给你们一个可复制的例子,我希望它对你们有用

    • 在本例中,我使用了库MASS中的Rabbit数据集
    • 要为下一个下拉菜单过滤数据,我使用库中的过滤器 dplyr(参见第30行)
    • 我使用反应式表达式管理下一个下拉菜单(参见第行) 29)
    • 我使用nearPoints()来管理悬停点(参见第55行)
    库(闪亮)
    图书馆(弥撒)
    图书馆(dplyr)
    图书馆(GG2)
    ui%选择(运行)
    })
    输出$selected_var1%filter(治疗==输入$var1)%>%filter(运行==输入$var2),aes(x=BPchange,y=Dose))+geom_point()
    })
    ###使用nearPoints()悬停点
    输出$info%filter(动物==输入$var)%%>%filter(治疗==输入$var1)%%>%filter(运行==输入$var2),输入$plot\u悬停)
    })
    }
    shinyApp(用户界面=用户界面,服务器=服务器)
    
    谢谢!!我更新了我的应用程序以使用plotly。只有一件事,每次绘图更新时,在显示绘图之前会短暂出现一个错误“警告:列中的错误
    text
    长度必须为0,而不是1”。一切似乎都正常,只是先闪现错误。你知道为什么会这样吗?编辑了我的答案:)谢谢!!我更新了我的应用程序以使用plotly。只有一件事,每次绘图更新时,在显示绘图之前会短暂出现一个错误“警告:列中的错误
    text
    长度必须为0,而不是1”。一切似乎都正常,只是先闪现错误。你知道为什么会这样吗?编辑了我的答案:)