我正在尝试开发一个闪亮的应用程序,其中有多个选项卡上的数据输入。每个选项卡下的内容可以自行运行,但是当我尝试将它们组合到一个应用程序中时,我仍然会收到此错误。 match.arg(position)中的错误:'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())))
})
})
答案 0 :(得分:2)
div()
中tabItem
的第二个tabItems
中有一个额外的ui.R
个元素。要么提供您隐含的参数,要么删除该div()元素。另外,我在session
中的shinyServer()
函数中添加了server.R
参数。这些更改后,应用程序运行没有任何错误。
编辑:
您忘记在tabItem
函数中为Contingency
添加一个tabItems()
。此外,最好区分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())))
})
})