使用循环从输入中闪亮地分配反应变量 [英] Shiny assign reactive variable from input using loop

查看:72
本文介绍了使用循环从输入中闪亮地分配反应变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to assign reactive variable based on my input using loop. For example, I want to select the column (from input) in iris data set. Then get the unique value from that column. And I want to do this in the loop. I find it works for my 'joke' variable, but not for my 'Group[[paste0('Gcol',i)]]' variable. I've been searching answer for this for days.

谢谢您的帮助!

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)

推荐答案

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

data[, which(colnames(data)=="Species")] is not a dataframe, this is the column Species, a factor. If you want to allow a one-column dataframe, do data[, which(colnames(data)=="Species"), drop=FALSE]

用下面的代码替换循环,您的应用程序可以运行(但可能不如您期望的那样;我不确定您想要什么).

Replace your loop with the following one, and your app works (but maybe not as you expect; I'm not sure to understand what you want).

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

这篇关于使用循环从输入中闪亮地分配反应变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆