2015-07-10 267 views
1

我想開發一個閃亮的應用程序,其中有多個選項卡上的數據輸入。每個標籤下的內容都能正常工作,但是當我嘗試將它們組合成一個應用程序時,我仍然會收到此錯誤。 match.arg(position)中的錯誤:'arg'必須爲NULL或字符向量。我的代碼如下:match.arg(位置)錯誤:'arg'必須爲NULL或字符向量

library(shiny) 
library(shinydashboard) 
library(ggvis) 
sidebar <- dashboardSidebar(
    hr(), 
    sidebarMenu(id="tabs", 
       menuItem("Import Data", tabName = "Import", icon=icon("list-alt")), 
       menuItem("Bivariate Regression", tabName="Bivariate Regression", icon=icon("line-chart")), 
       menuItem("Contingency", tabName = "Contingency", icon = icon("table")) 
)) 

    body <- dashboardBody(
    tabItems(  
     tabItem(tabName= "Import", 
       sidebarLayout(
       sidebarPanel(
        fileInput("file","Upload the file"), 
        tags$hr(), 
        h5(helpText("Select the table parameters below")), 
        checkboxInput(inputId = 'header', label= 'Header', value= TRUE), 
        checkboxInput(inputId = "stringsAsFactors", "stringsAsFactors", FALSE), 
        br(), 
        radioButtons(inputId = 'sep', label = 'Seperator', choices = c(Comma=',', Semicolon=';', Tab='\t', Space= ' '), selected= ',') 
       ), 
       mainPanel(
        uiOutput("tb") 
       ) 
      )), 

     tabItem(tabName= "Bivariate Regression", 
       sidebarLayout(
       div(), 
       sidebarPanel(
        fileInput('datfile', ''), 
        selectInput('x', 'x:' ,'x'), 
        selectInput('y', 'y:', 'y'), 
        uiOutput("plot_ui") 
       ), 
       mainPanel(
        titlePanel("Plot Output"), 
        ggvisOutput("plot") 
       ) 
      )) 
    )) 


dashboardPage(
dashboardHeader(title = "COBE Dashboard"), 
    sidebar, 
    body) 

和服務器

library(shiny) 
library(dplyr) 
library(ggvis) 
shinyServer(function(input, output){ 
    #read the data and give import prefrences 
    data <- reactive({ 
    file1 <- input$file 
    if(is.null(file1)){return()} 
    read.table(file=file1$datapath, sep= input$sep, header= input$header, stringsAsFactors= input$stringsAsFactors) 
    }) 

    # display summary of table output 
    output$filledf <-renderTable({ 
    if(is.null(data())){return()} 
    input$file 
    }) 

    output$sum <- renderTable({ 
    if(is.null(data())){return()} 
    summary(data()) 

    }) 
    output$table <- renderTable({ 
    if(is.null(data())){return()} 
    data() 

    }) 

    #generate tabsets when the file is loaded. 
    output$tb <- renderUI({ 
    if(is.null(data())) 
     h2("App powered by", tags$img(src='Blue.png', height= 100, width=250)) 
    else 
     tabsetPanel(tabPanel("About file", tableOutput("filledf")), tabPanel("Data", tableOutput("table")), tabPanel("Summary", tableOutput("sum"))) 
    }) 
########## Data import end ######### 

    ########## Bivariate regression begin ########### 
    #load the data when the user inputs a file 
    theData <- reactive({ 
    infile <- input$datfile   
    if(is.null(infile)) 
     return(NULL)   
    d <- read.csv(infile$datapath, header = T) 
    d   
    }) 

    # dynamic variable names 
    observe({ 
    data<-theData() 
    updateSelectInput(session, 'x', choices = names(data)) 
    updateSelectInput(session, 'y', choices = names(data)) 

    }) # end observe 

    #gets the y variable name, will be used to change the plot legends 
    yVarName<-reactive({ 
    input$y 
    }) 

    #gets the x variable name, will be used to change the plot legends 
    xVarName<-reactive({ 
    input$x 
    }) 

    #make the filteredData frame 

    filteredData<-reactive({ 
    data<-isolate(theData()) 
    #if there is no input, make a dummy dataframe 
    if(input$x=="x" && input$y=="y"){ 
     if(is.null(data)){ 
     data<-data.frame(x=0,y=0) 
     } 
    }else{ 
     data<-data[,c(input$x,input$y)] 
     names(data)<-c("x","y") 
    } 
    data 
    }) 

    #plot the ggvis plot in a reactive block so that it changes with filteredData 
    vis<-reactive({ 
    plotData<-filteredData() 
    plotData %>% 
     ggvis(~x, ~y) %>% 
     layer_points() %>% 
     add_axis("y", title = yVarName()) %>% 
     add_axis("x", title = xVarName()) %>% 
     add_tooltip(function(df) format(sqrt(df$x),digits=2)) 
    }) 
    vis%>%bind_shiny("plot", "plot_ui") 

##### add contingency table ######## 
    # display contingcy table output 
    output$foo <- renderTable({ 
    if(is.null(data())){return()} 
    as.data.frame.matrix(table((data()))) 
    }) 

}) 

回答

1

有在ui.RtabItems額外div()元素在第二tabItem。要麼提供你暗示的參數,要麼移除該div()元素。另外,我在server.R中增加了session參數給shinyServer()函數。這些更改應用程序運行後沒有任何錯誤。

編輯:

你忘了添加一個ContingencytabItemtabItems()功能。此外,最好區分tabName和該標籤的標題。根據我的經驗,標籤名稱中不應有空格,這就是爲什麼Bivariate Regression標籤之前無法使用的原因。它應該現在工作正常。

更新代碼:

ui.R

library(shiny) 
library(shinydashboard) 
library(ggvis) 
sidebar <- dashboardSidebar(
    br(), 
    sidebarMenu(id="tabs", 
       menuItem("Import Data", tabName = "import", icon=icon("list-alt")), 
       menuItem("Bivariate Regression", tabName="bivariate_regression", icon=icon("line-chart")), 
       menuItem("Contingency", tabName = "contingency", icon = icon("table")) 
)) 

body <- dashboardBody(
    tabItems(  
    tabItem(tabName= "import", 
      sidebarLayout(
       sidebarPanel(
       fileInput("file","Upload the file"), 
       tags$hr(), 
       h5(helpText("Select the table parameters below")), 
       checkboxInput(inputId = 'header', label= 'Header', value= TRUE), 
       checkboxInput(inputId = "stringsAsFactors", "stringsAsFactors", FALSE), 
       br(), 
       radioButtons(inputId = 'sep', label = 'Seperator', choices = c(Comma=',', Semicolon=';', Tab='\t', Space= ' '), selected= ',') 
      ), 
       mainPanel(
       uiOutput("tb") 
      ) 
      )), 

    tabItem(tabName= "bivariate_regression", 
      sidebarLayout(
       #div(), 
       sidebarPanel(
       fileInput('datfile', ''), 
       selectInput('x', 'x:' ,'x'), 
       selectInput('y', 'y:', 'y'), 
       uiOutput("plot_ui") 
      ), 
       mainPanel(
       titlePanel("Plot Output"), 
       ggvisOutput("plot") 
      ) 
      )), 
    tabItem(tabName="contingency", h2("Contigency Tab content")) 
)) 


dashboardPage(
    dashboardHeader(title = "COBE Dashboard"), 
    sidebar, 
    body) 

server.R

library(shiny) 
library(dplyr) 
library(ggvis) 
shinyServer(function(input, output,session){ 
    #read the data and give import prefrences 
    data <- reactive({ 
    file1 <- input$file 
    if(is.null(file1)){return()} 
    read.table(file=file1$datapath, sep= input$sep, header= input$header, stringsAsFactors= input$stringsAsFactors) 
    }) 

    # display summary of table output 
    output$filledf <-renderTable({ 
    if(is.null(data())){return()} 
    input$file 
    }) 

    output$sum <- renderTable({ 
    if(is.null(data())){return()} 
    summary(data()) 

    }) 
    output$table <- renderTable({ 
    if(is.null(data())){return()} 
    data() 

    }) 

    #generate tabsets when the file is loaded. 
    output$tb <- renderUI({ 
    if(is.null(data())) 
     h2("App powered by", tags$img(src='Blue.png', height= 100, width=250)) 
    else 
     tabsetPanel(tabPanel("About file", tableOutput("filledf")), tabPanel("Data", tableOutput("table")), tabPanel("Summary", tableOutput("sum"))) 
    }) 
    ########## Data import end ######### 

    ########## Bivariate regression begin ########### 
    #load the data when the user inputs a file 
    theData <- reactive({ 
    infile <- input$datfile   
    if(is.null(infile)) 
     return(NULL)   
    d <- read.csv(infile$datapath, header = T) 
    d   
    }) 

    # dynamic variable names 
    observe({ 
    data<-theData() 
    updateSelectInput(session, 'x', choices = names(data)) 
    updateSelectInput(session, 'y', choices = names(data)) 

    }) # end observe 

    #gets the y variable name, will be used to change the plot legends 
    yVarName<-reactive({ 
    input$y 
    }) 

    #gets the x variable name, will be used to change the plot legends 
    xVarName<-reactive({ 
    input$x 
    }) 

    #make the filteredData frame 

    filteredData<-reactive({ 
    data<-isolate(theData()) 
    #if there is no input, make a dummy dataframe 
    if(input$x=="x" && input$y=="y"){ 
     if(is.null(data)){ 
     data<-data.frame(x=0,y=0) 
     } 
    }else{ 
     data<-data[,c(input$x,input$y)] 
     names(data)<-c("x","y") 
    } 
    data 
    }) 

    #plot the ggvis plot in a reactive block so that it changes with filteredData 
    vis<-reactive({ 
    plotData<-filteredData() 
    plotData %>% 
     ggvis(~x, ~y) %>% 
     layer_points() %>% 
     add_axis("y", title = yVarName()) %>% 
     add_axis("x", title = xVarName()) %>% 
     add_tooltip(function(df) format(sqrt(df$x),digits=2)) 
    }) 
    vis%>%bind_shiny("plot", "plot_ui") 

    ##### add contingency table ######## 
    # display contingcy table output 
    output$foo <- renderTable({ 
    if(is.null(data())){return()} 
    as.data.frame.matrix(table((data()))) 
    }) 

}) 
+0

謝謝你的忠告@Shiva。更新的代碼使應用程序運行,但是當我更改爲不同的選項卡時,雙變量回歸和應變表不會顯示出來。我想讓每個標籤都能正常工作。 –

+0

我編輯了答案。現在檢查! – Shiva

+0

非常感謝!它完美的作品,我不能更高興!感謝溼婆! –

相關問題