使用循环从输入中闪亮分配反应变量

时间:2017-06-12 15:18:15

标签: loops shiny reactive

我正在尝试使用循环根据我的输入分配反应变量。例如,我想在虹膜数据集中选择列(来自输入)。然后从该列中获取唯一值。我想在循环中做到这一点。我发现它适用于我的'笑话'变量,但不适用于我的'Group [[paste0('Gcol',i)]]'变量。我好几天都在寻找答案。

提前感谢您的帮助!

library(shiny)
data=iris


ui <- fluidPage(

titlePanel("Old Faithful Geyser Data"),

sidebarLayout(
  sidebarPanel(

     fluidRow(
       column(9,wellPanel(lapply(1:5, function(i) {
         selectizeInput(paste0('GroupVar',i), paste0('Group ',i), choices = sort(colnames(data)),
                        options = list(placeholder = 'Select one',
                                       onInitialize = I('function() { 
this.setValue(""); }')))
       })
       )))
  ),

  mainPanel(
             fluidRow(column(6, wellPanel(
                lapply(1:5, function(i) {
                  uiOutput(paste0('GroupOpt', i))
                })
              ))),
             textOutput("try4"),
             textOutput("try2"),
             textOutput("try21"),
             textOutput("try3"),
             textOutput("try")
  )
)
)

server <- function(input, output) {

Group=reactiveValues()

for (i in 1:5){
Group[[paste0('Gcol',i)]]=reactive({
data[,which(colnames(data)==
input[[paste0('GroupVar',i)]])]})
}

joke=reactive({data[,which(colnames(data)==input[[paste0('GroupVar',1)]])]})

lapply(1:5, function(i) { output[[paste0('GroupOpt',i)]] = renderUI({
selectInput(paste0("GroupOpt",i), "Select group",multiple=TRUE,
            sort(as.character(unique(Group[[paste0('Gcol',i)]])))
 )
  })})

output$try4 = renderText({print(paste0('it 
is',input[[paste0('GroupVar',1)]]))})
output$try2 = renderText({print(dim( Group[[paste0('Gcol',1)]]()))})
output$try21 = renderText({print(class( Group[[paste0('Gcol',1)]]()))})
output$try3 = 
renderText({print(which(colnames(data)==input[[paste0('GroupVar',1)]]))})

 output$try = renderText({print(unique(as.character(joke())))})


}

# Run the application 
shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:0)

<template lang="html"> <div class="line-edit"> <div class="line-edit__title">{{title}}</div> <input class="line-edit__input" ref="textInput" type="text" :value="value" @input="updateInput()" /> </div> </template> <script type="text/javascript"> export default { components: { }, computed: { }, methods: { updateInput: function(){ this.$emit('input', this.$refs.textInput.value) } }, data: function(){ return {} }, props: { title:{ default:"", type:String }, value: { default: "", type: String } } } </script> 不是数据框,这是列data[, which(colnames(data)=="Species")],一个因素。如果您想允许单列数据框,请执行Species

用以下内容替换你的循环,你的应用程序有效(但可能没有你期望的那样;我不确定你想要什么)。

data[, which(colnames(data)=="Species"), drop=FALSE]