2017-09-06 84 views
1

我正在創建一個Shiny應用程序,該應用程序從兩個輸入開始創建一個有序列表。該列表旨在根據它們的關係來排列數據庫對象。如果語句在Shiny中不起作用

由於我確定了可能的輸入,我插入了一些if語句,但這不起作用(我得到的結果是整個數據集而不是我選擇的部分)。

我有三個主要dataframes工作:

  • 環境(ENVNAME,A1,A2,A3爲列),這個想法是,我需要完成完整的架構名稱加上環境和ENV取決於區域的前綴更改
  • 關係:所有父子關係的列表 -Schemas:所有模式名稱的列表,分爲不同的區域,第1部分和第2部分允許構建全名。

編輯:我更新了代碼。請注意,我已經使用了運行序列作爲反應部分的輸出嘗試,但我得到了閃亮的應用,而不是表這個錯誤:

'data' must be 2-dimensional (e.g. data frame or matrix) 

代碼如下

library(shiny) 

library(shinydashboard) 
library(dplyr) 



ui <- shinyUI(pageWithSidebar(
    headerPanel("Run Order List"), 
    sidebarPanel(
    #declare 2 text inputs and submit button 
    selectInput("EnvName", "Environment:", c("Env")), 
    selectInput("Area", "Area:", c("A1", "A2","A3")), 

    actionButton(
     inputId = "submit_loc", 
     label = "Submit") 

), 
    mainPanel(
    DT::dataTableOutput("RunOrder") 

) 
)) 

## 
server <- shinyServer(function(input, output, session) { 


    observeEvent(
    eventExpr = input[["submit_loc"]], 
    handlerExpr = { 

     input$EnvName 
     input$Area 

    #Loading the data 



     Relationships <- read.csv("myfile", header = TRUE, sep = ";") 
     Environments <- read.csv("myfile2", header = TRUE, sep = ";") 
     Schemas <- read.csv("myfile3", header = TRUE, sep = ";") 

    ##CreatingListofSchemas 

    out <- reactive({ 
    if (input$Area == "A1") 
     { 
     Environments <-subset(Environments, EnvName == input$EnvName) 
     Relevant_schemas <- subset(Schemas, Area == "A1") 
     Relevant_schemas $FullName <- paste(Relevant_schemas $Part1,Environment$A1,Relevant_schemas$Part2, sep="") 
     } 
    else if(input$Area == "A2"){ 

       Environments <-subset(Environments, EnvName == input$EnvName) 
          Relevant_schemas <- subset(Schemas, Area == "A2") 
          Relevant_schemas$FullName <- paste(Environment$A2,Relevant_schemas$Part1, sep="") 
          } 
    else{ 

     Environments <-subset(Environments, EnvName == input$EnvName) 
     Relevant_schemas <- subset(Schemas, Area == "A3") 
     Relevant_schemas $FullName <- paste(Relevant_schemas$Part1,Environment$A3,Csa_schemas$Part2, sep="")} 

    return(Relevant_schemas$FullName) 
    }) 

    #Selecting environment 

    Relationships <- subset(Relationships, grepl(paste(Relevant_schemas$FullName, collapse = "|"), Relationships$ParentDB)) 

Level1Tables <- subset(Relationships, select = c(Parent), !(Parent %in% c(Child))) 

    Level1Tables <- unique(Level1Tables) 
    colnames(Level1Tables)<- "tables" 
    Level1Tables$Level <- 1 

    RunOrder <- Level1Tables 

    RemainingTables <- anti_join(AllTables, RunOrder, by = NULL, copy = TRUE)} 


    output$RunOrder = DT::renderDataTable({ 
     RunOrder 
    }) 
    }) 
}) 
## 
shinyApp(ui = ui, server = server) 

下面小編重複的例子(固定和當前工作)。然而,該應用程序仍然沒有響應輸入:

ParentDB <- c('s1A1p1', 'A2', 'A3') 
ParentTable <- c('Tab1', 'Tab2', 'Tab3') 
Relationships <- data.frame(ParentDB, ParentTable) 

EnvName <- c("Env") 
A1 <- c('A1') 
A2 <- c('A2') 
A3 <- c('A3') 

Environments <- data.frame(EnvName, A1,A2, A3) 

Part1 <- c('s1', 's2','s3') 
Part2 <- c('p1', 'p2','p3') 
Area <- c('A1','A2', 'A3') 
SchemaList <- data.frame(Part1,Part2,Area) 
Schemas <- SchemaList 

Area <- "A1" 
if(Area =="A1") 
{ 
    Environments <-subset(Environments, EnvName == "Env") 
    SchemaList <- subset(Schemas, Area == "A1") 
    SchemaList$FullName <- paste(SchemaList$Part1,Environments$A1,SchemaList$Part2, sep="") 
} else if(Area == "A2") 
    { 

    Environments <-subset(Environments, EnvName == "Env") 
    SchemaList <- subset(Schemas, Area == "A2") 
    SchemaList$FullName <- paste(Environments$A2,SchemaList$Part1, sep="") 
} else { 

    Environments <-subset(Environments, EnvName == "Env") 
    SchemaList <- subset(Schemas, Area == "A3") 
    SchemaList$FullName <- paste(SchemaList$Part1,Environments$A3,SchemaList$Part2, sep="")} 


#Selecting environment 

Relationships <- subset(Relationships, grepl(paste(SchemaList$FullName, collapse = "|"), Relationships$ParentDB)) 
+0

你的大部分代碼的細節更新的代碼的有關部分是不相關的實際問題。如果你可以製作一個重點放在*最小*的[mcve],這將會很有幫助。 –

+0

在您的代碼中定義了「RunOrder」在哪裏? (我的意思是在服務器上)。 '無功'輸出'出' – akrun

+0

@akrun我現在已經在RunOrder上添加了該部分並編輯了該部分。 – Barbara

回答

1

我設法修復代碼,我發佈這個以防萬一它對其他人有用。問題出現在if語句和反應函數中。我沒有使用反應函數,而是將輸入分配給一個變量,然後用它來完成其他操作。

下面

server <- shinyServer(function(input, output, session) { 


    observeEvent(
    eventExpr = input[["submit_loc"]], 
    handlerExpr = { 

     AreaSelect <- input$Area 
     EnvSelect <- input$EnvName 

    if (AreaSelect == "A1") 
     { 
     Environments <-subset(Environments, EnvName == EnvSelect) 
     Relevant_schemas <- subset(Schemas, Area == "A1") 
     Relevant_schemas $FullName <- paste(Relevant_schemas $Part1,Environments$A1,Relevant_schemas$Part2, sep="") 
     }  else if(AreaSelect == "A2"){ 

       Environments <-subset(Environments, EnvName == EnvSelect) 
          Relevant_schemas <- subset(Schemas, Area == "A2") 
          Relevant_schemas$FullName <- paste(Environments$A2,Relevant_schemas$Part1, sep="") 
    }  else { 

     Environments <-subset(Environments, EnvName == EnvSelect) 
     Relevant_schemas <- subset(Schemas, Area == "A3") 
     Relevant_schemas $FullName <- paste(Relevant_schemas$Part1,Environments$A3,Csa_schemas$Part2, sep="")} 

    return(Relevant_schemas$FullName) 


    #Selecting environment 

    Relationships <- subset(Relationships, grepl(paste(Relevant_schemas$FullName, collapse = "|"), Relationships$ParentDB))