2017-06-12 36 views
1

我想根據我的輸入使用循環來分配無功變量。例如,我想選擇虹膜數據集中的列(從輸入)。然後從該列中獲取唯一值。我想在循環中做到這一點。我發現它適用於我的'玩笑'變量,但不適用於我的'Group [[paste0('Gcol',i)]]''變量。我一直在爲這個問題尋找答案。Shiny使用循環從輸入分配無功變量

非常感謝您的幫助!

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

如果您運行代碼,請在'Group1'中選擇'species',您會發現它可以找到列號,但爲什麼數據幀的維數爲0?當我使用笑話時,它工作得很好。 – shubei

回答

0

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)]])]}) 
    }) 
    }