我从上述问题中了解到的是:
所以,在这里,我将给你可重复的例子,我希望它对你有用。
library(shiny) library(MASS) library(dplyr) library(ggplot2) ui <- fluidPage( titlePanel("Rabbit dataset from MASS library"), fluidRow( column(4, selectInput("var", "Animal:", unique(sort(Rabbit$Animal)))), column(4, uiOutput("selected_var")), column(4, uiOutput("selected_var1")), column(12, plotOutput("selected_var2", hover = "plot_hover")), column(12, verbatimTextOutput("info")) ) ) server <- function(input, output) { ###FILTER NEXT DROPDOWN MENU BASED ON PREVIOUS SELECTED BY USER dataset3 <- reactive({ unique(Rabbit %>% filter(Animal == input$var) %>% select(Treatment)) }) output$selected_var <- renderUI({ selectInput("var1", "Treatment:", c(dataset3())) }) dataset4 <- reactive({ Rabbit %>% filter(Animal == input$var) %>% filter(Treatment == input$var1) %>% select(Run) }) output$selected_var1 <- renderUI({ selectInput("var2", "Run:", c(dataset4())) }) #### output$selected_var2 <- renderPlot({ ggplot(Rabbit %>% filter(Animal == input$var) %>% filter(Treatment == input$var1) %>% filter(Run == input$var2), aes(x = BPchange, y = Dose)) + geom_point() }) ###HOVER POINT USING nearPoints() output$info <- renderPrint({ nearPoints(Rabbit %>% filter(Animal == input$var) %>% filter(Treatment == input$var1) %>% filter(Run == input$var2), input$plot_hover) }) } shinyApp(ui = ui, server = server)
将来,请确保您共享一个可重现的示例:)
由于您的代码不可复制,请在下面找到您可以理解并适应您的情况的内容。
关于你的第一个问题,如果我理解正确,你想以编程方式生成一个下拉列表( selectInput )这是完全可行的。 *Input 实质上,s只是您可以动态生成的HTML内容,就像您的情节一样。你这样做 uiOutput (在你的ui中)和 renderUI 在你的服务器上。
selectInput
*Input
uiOutput
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)
关于你的第二个问题,你想要的是一个互动情节。有许多软件包可以让你在R和Shiny中做到这一点。以下是一些示例,绝不是一个全面的列表:
以下是使用highcharter的示例。它们都在Shiny中遵循相同的原则,a *Output 功能加上一个 render* 功能。
*Output
render*
library(shiny) library(highcharter) ui <- fluidPage( highchartOutput("chart") ) server <- function(input, output, session){ output$chart <- renderHighchart({ hchart(mpg, "scatter", hcaes(x = displ, y = hwy, group = class)) }) } shinyApp(ui, server)
的 编辑 强>
关于闪烁错误的问题。你需要 要求 ( req )所需的输入。在下面启动应用程序时,错误将闪烁,取消注释 req(input$y) 线,它会消失。
req
req(input$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)
从本质上讲,由于您的绘图依赖于动态生成输入的一小部分时间,因此在渲染时输入不可用, req 防止这种情况