动态selectInput,其中后续的selectInput依赖于先前的选择

时间:2017-06-16 18:05:06

标签: r shiny

我正在尝试创建一个Shiny页面,其中包含基于查询结果的动态输入。我希望输入选择取决于之前的selectInput()选择。查询结果作为一系列data.tables返回,保存在reactiveValue()中,结构如下:

V1    V2    V3    V4          V5    key_index
along with  this  development comes 45473

第一个selectInput()选项选项只是第一个data.table的粘贴列V1:V5的列表。我试图使其成为下一个和后续的selectInputs()由其关联表的V1:V5组成,其中该表的V1与前一个的V5相同。使用样本数据,第二个selectInput()的选择将仅由数据的ngram组成。表2以'开头。这就是我试图创建第一个输入的方式,它会返回一个我可以用来设置第二个输入的值,但我甚至无法超越系列中的第一个输入。有没有更好的方法呢?

trythis <- reactive({
  tmpthis <- unlist(lapply(1:nrow(ngra1), function(n) ngra1[n,5]))
  return(tmpthis)
})
trythat <- reactive({
  tmpthat <- unlist(lapply(1:nrow(ngra1), function(m) paste0(ngra1[m,1:5],collapse=" ")))
  return(tmpthat)
})
output$oneapage <- renderUI({
  sidebarLayout(
    sidebarPanel(
      fluidRow(
        print(trythat()),
        print(trythis()),
        thing <- for(j in 1:length(trythat())){paste("'",trythat()[[j]],"' = '",trythis()[[j]],"'")},
        selectInput("tester","test",choices = c(thing[1:length(thing)]))
    )
),

2 个答案:

答案 0 :(得分:0)

我编写了以下数据框,其结构与您的相似。它是一个3列数据框架:

df <- data.frame( V1 = letters[1:10],
                  V2 = letters[2:11],
                  V3 = letters[3:12] )

  V1 V2 V3
1  a  b  c
2  b  c  d
3  c  d  e
...

我列出了choice1选项:

C1.options <- with(df, paste(V1,V2,V3))
[1] "a b c" "b c d" "c d e" ...

您希望用户在C1.options之间选择df然后子集df$V1 == choice1$V3之间的条目(让我们称之为C2.options }),然后让用户在C2.options中选择一个条目。

这是执行此操作的代码块:

ui <- fluidPage( 
          selectInput("choice1", "First Choice", C1.options, selected=NULL),
          htmlOutput("plot1")    # render dynamic selectInput in server
      )

server <- function(input,output){
              data <- reactive({ Str <- unlist(strsplit(input$choice1," "))
                                 Str <- Str[length(Str)]   # Grab last character in option 1
                                 Filt <- df %>% filter(V1 == Str)   # Filter by condition
                                 C2.options <- with(Filt, paste(V1,V2,V3))
                                 return(C2.options) })
              output$plot1 <- renderUI({ selectInput("choice2", "Second Choice", data(), selected=NULL)   })
           }

shinyApp(ui=ui,server=server)

答案 1 :(得分:0)

这是我最终确定的代码。允许我最终将它全部拉到一起的位是使用Date.prototype.getWeek = function() { var onejan = new Date(this.getFullYear(), 0, 1); return Math.ceil((((this - onejan) / 86400000) + onejan.getDay() + 1) / 7); } document.write('<br>D1 - 01st June 2017: ' + new Date(2017, 6, 1).getWeek()); document.write('<br>D2 - 26th June 2017: ' + new Date(2017, 6, 26).getWeek()); var weeksBetween = new Date(2017, 6, 26).getWeek() - new Date(2017, 6, 01).getWeek(); document.write('<br><br>Weeks between D1 and D2: ' + weeksBetween);来访问输入变量的内容

input[[]]