#r #shiny
Вопрос:
Поэтому я пытаюсь создать панель мониторинга в R, где на первой вкладке пользователи могут вводить свои данные в csv-файл. А во второй вкладке они увидят сводку и график своих данных. На вкладке «График» пользователи должны будут выбрать xlabel и ylabel из столбцов набора данных, а на графике A будет показана точечная диаграмма метки xlabel и y.
ui <- dashboardPage(skin='red',
dashboardHeader(title = "Dashboard"),
## Sidebar content
dashboardSidebar(
sidebarMenu(
menuItem("Data", tabName = "dashboard"),
menuItem("Visualization", tabName = "viz",
menuSubItem("Summary",tabName="sum"),
menuSubItem("Plot",tabName = "plot")),
menuItem("Interpretation", tabName = "int")
) ),
## Body content
dashboardBody(
tabItems(
# First tab content
tabItem(tabName = "dashboard",
fluidPage(titlePanel("DATA"),
fluidRow(
column(width=4,
fileInput("file1", "Input CSV file",
multiple = TRUE,
accept = c("text/csv",
"text/comma-separated-values,text/plain",
".csv"))),
column(width=2,checkboxInput("header", "Header", TRUE)),
column(width=2,radioButtons("sep","Separator",
choices = c(Comma=",",
Semicolon = ";",
Tab = "t"),
selected = ",")),
column(width=2,radioButtons("quote", "Quote",
choices = c(None = "",
"Double Quote" = '"',
"Single Quote" = "'"),
selected = '"')),
column(width=2,radioButtons("disp", "Display",
choices = c(Head = "head",
All = "all"),
selected = "head"))
),
tableOutput("contents")
)),
# Second tab content
tabItem(tabName = "sum",
box(
title="Summary",
status="primary",
solidHeader = TRUE,
width = "100%",
collapsible = TRUE,
verbatimTextOutput("summary")
)
),
tabItem(tabName="plot",
h2("Plot"),
fluidRow(
selectInput("sip","select",choices = 1:10),
selectInput("sila","anda",choices = 1:10)
),
fluidRow(
box(
title = "Plot A",
status= "primary",
solidHeader = TRUE,
collapsible = TRUE,
plotOutput("plota",height="300px")
),
box(
title = "Plot B",
status= "primary",
solidHeader = TRUE,
collapsible = TRUE,
plotOutput("plotb",height="300px"
)
)
)),
tabItem(tabName = "int",
h2("hello")
)
)
))
server <- function(input, output,session) {
output$contents <- renderTable({
# input$file1 will be NULL initially. After the user selects
# and uploads a file, head of that data file by default,
# or all rows if selected, will be shown.
req(input$file1)
df <- read.csv(input$file1$datapath,
header = input$header,
sep = input$sep,
quote = input$quote)
if(input$disp == "head") {
return(head(df))
}
else {
return(df)
}
})
output$summary <- renderPrint({
req(input$file1)
dataset<- read.csv(input$file1$datapath,
header = input$header,
sep = input$sep,
quote = input$quote)
summary(dataset)
})
output$plota <- renderPlot({
req(input$file1)
dataset<- read.csv(input$file1$datapath,
header = input$header,
sep = input$sep,
quote = input$quote)
updateSelectInput(session,"sip",label="label",choices=names(dataset))
updateSelectInput(session,"sila",label="label",choices = names(dataset))
plot(dataset[eventReactive(input$sip)],dataset[eventReactive(input$sila)],pch=19)
})
output$plotb <- renderPlot({
})
}
shinyApp(ui, server)
Вот как выглядит код. Когда я запускаю эту программу, это приводит к ошибке: аргумент «expr» отсутствует без значения по умолчанию. Что такое expr в этом контексте?
Комментарии:
1. Что вы пытаетесь сделать с
eventReactive(input$sip)
командой внутри вашего сюжета? Это неправильный синтаксис. Вам нужно выражение события и выражение значения. Вам не хватает выражения значения.
Ответ №1:
Вам не нужно использовать eventReactive
, так renderPlot
как это реактивное выражение, используйте только input$..
Другая проблема заключается в том , что вы пытаетесь обновить selectImput
» ы » внутри renderPlot
, что не сработает. Вы должны обновить их другим реактивным выражением, например reactive()
, где вы также можете прочитать файл вместо того, чтобы читать его несколько раз. Ниже приведен ваш код, измененный для решения проблемы, а также чтение файла только один раз внутри реактивного выражения.
library(shiny)
library(shinydashboard)
ui <- dashboardPage(skin='red',
dashboardHeader(title = "Dashboard"),
## Sidebar content
dashboardSidebar(
sidebarMenu(
menuItem("Data", tabName = "dashboard"),
menuItem("Visualization", tabName = "viz",
menuSubItem("Summary",tabName="sum"),
menuSubItem("Plot",tabName = "plot")),
menuItem("Interpretation", tabName = "int")
) ),
## Body content
dashboardBody(
tabItems(
# First tab content
tabItem(tabName = "dashboard",
fluidPage(titlePanel("DATA"),
fluidRow(
column(width=4,
fileInput("file1", "Input CSV file",
multiple = TRUE,
accept = c("text/csv",
"text/comma-separated-values,text/plain",
".csv"))),
column(width=2,checkboxInput("header", "Header", TRUE)),
column(width=2,radioButtons("sep","Separator",
choices = c(Comma=",",
Semicolon = ";",
Tab = "t"),
selected = ",")),
column(width=2,radioButtons("quote", "Quote",
choices = c(None = "",
"Double Quote" = '"',
"Single Quote" = "'"),
selected = '"')),
column(width=2,radioButtons("disp", "Display",
choices = c(Head = "head",
All = "all"),
selected = "head"))
),
tableOutput("contents")
)),
# Second tab content
tabItem(tabName = "sum",
box(
title="Summary",
status="primary",
solidHeader = TRUE,
width = "100%",
collapsible = TRUE,
verbatimTextOutput("summary")
)
),
tabItem(tabName="plot",
h2("Plot"),
fluidRow(
selectInput("sip","select",choices = 1:10),
selectInput("sila","anda",choices = 1:10)
),
fluidRow(
box(
title = "Plot A",
status= "primary",
solidHeader = TRUE,
collapsible = TRUE,
plotOutput("plota",height="300px")
),
box(
title = "Plot B",
status= "primary",
solidHeader = TRUE,
collapsible = TRUE,
plotOutput("plotb",height="300px"
)
)
)),
tabItem(tabName = "int",
h2("hello")
)
)
))
server <- function(input, output,session) {
dataset <- reactive({
req(input$file1)
dat <- read.csv(input$file1$datapath,
header = input$header,
sep = input$sep,
quote = input$quote)
updateSelectInput(session,"sip",choices=names(dat))
updateSelectInput(session,"sila",choices = names(dat))
dat
})
output$contents <- renderTable({
# input$file1 will be NULL initially. After the user selects
# and uploads a file, head of that data file by default,
# or all rows if selected, will be shown.
req(input$file1)
df <- dataset()
if(input$disp == "head") {
return(head(df))
}
else {
return(df)
}
})
output$summary <- renderPrint({
req(input$file1)
summary(dataset())
})
output$plota <- renderPlot({
plot(dataset()[[input$sip]],dataset()[[input$sila]],pch=19)
})
output$plotb <- renderPlot({
})
}
shinyApp(ui, server)