【问题标题】:Shiny assign reactive variable from input using loop使用循环从输入中分配反应变量
【发布时间】:2017-11-14 03:22:34
【问题描述】:

我正在尝试使用循环根据我的输入分配反应变量。例如,我想在 iris 数据集中选择列(来自输入)。然后从该列中获取唯一值。我想在循环中做到这一点。我发现它适用于我的 'joke' 变量,但不适用于我的 '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)

【问题讨论】:

  • 如果你运行代码,在'Group1'中选择'species',可以发现可以找到列号,但是为什么数据框的维度是0呢?当我使用笑话时,效果很好。

标签: loops shiny reactive


【解决方案1】:

data[, which(colnames(data)=="Species")] 不是数据框,这是Species 列,是一个因素。如果您想允许单列数据框,请执行data[, which(colnames(data)=="Species"), drop=FALSE]

用下面的循环替换你的循环,你的应用就可以工作了(但可能不是你期望的那样;我不确定你想要什么)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 2019-08-11
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    相关资源
    最近更新 更多