我正在尝试上传数据,然后从上传的数据中选择变量以生成散点图。
我所关心的问题
为了解决这个问题,我觉得我必须添加一个observe地方并将其连接到其他模块。像这样的东西observe({updateSelectInput(session, "var1", choices = names(dtreact()))})
现在应用程序无法运行并输出以下错误:Error in varselect_ui("select") : object 'dtreact' not found
这是示例.csv 文件的链接
library(shiny)
library(dplyr)
library(rlang)
library(ggplot2)
scatter_plot <- function(dataset, xvar, yvar) {
x <- rlang::sym(xvar)
y <- rlang::sym(yvar)
p <- ggplot(dataset, aes(x = !!x, y = !!y)) +
geom_point() +
theme(axis.title = element_text(size = rel(1.2)),
axis.text = element_text(size = rel(1.1)))
return(p)
}
importUI <- function(id) {
ns <- NS(id)
tagList(
fileInput(ns("file1"), "Choose CSV File", accept = ".csv"),
checkboxInput(ns("header"), "Header", TRUE),
tableOutput(ns("contents"))
)
}
importSE <- function(id) {
moduleServer(id,
function(input, output, session) {
dtreact <- reactive({
file <- input$file1
if (is.null(file))
return(NULL)
read.csv(file$datapath, header = input$header)
})
output$contents <- renderTable({
dtreact()
})
}
)
}
varselect_ui <- function(id) {
ns <- NS(id)
var_choices <- names(dtreact)
tagList(selectInput(ns("xvar"), "Select X variable", choices = var_choices, selected = NULL),
selectInput(ns("yvar"), "Select Y variable", choices = var_choices, selected = NULL))
}
varselect_server <- function(id) {
moduleServer(id,
function(input, output, session) {
return(
list(
xvar = reactive({input$xvar}),
yvar = reactive({input$yvar})
)
)
}
)
}
scatterplot_ui <- function(id) {
ns <- NS(id)
plotOutput(ns("plot1"))
}
scatterplot_server <- function(id) {
moduleServer(id,
function(input, output, session, dataset, plot1vars, plot2vars) {
plot1_obj <- reactive({
p <- scatter_plot(dataset, xvar = plot1vars$xvar(), yvar = plot1vars$yvar())
return(p)
})
output$plot1 <- renderPlot({
plot1_obj()
})
}
)
}
ui <- fluidPage(
importUI("import"),
varselect_ui("select"),
scatterplot_ui("scatter")
)
server <- function(input, output, session) {
importSE("import")
varselect_server("select")
scatterplot_server("scatter")
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
代码改编自此示例
您不需要observe,而是需要一种将模块的输出链接到模块的输入的智能方法。因此,请return在生成应由其他模块使用的数据的模块中使用,并将这些值存储在主server函数中的变量中。然后您可以将这些变量用作其他模块的输入。同样重要的是,如果您将反应作为输入传递给模块,则需要不对它们进行求值(因此传递dataset而不是dataset()):
library(shiny)
library(dplyr)
library(rlang)
library(ggplot2)
scatter_plot <- function(dataset, xvar, yvar) {
x <- rlang::sym(xvar)
y <- rlang::sym(yvar)
p <- ggplot(dataset, aes(x = !!x, y = !!y)) +
geom_point() +
theme(axis.title = element_text(size = rel(1.2)),
axis.text = element_text(size = rel(1.1)))
return(p)
}
importUI <- function(id) {
ns <- NS(id)
tagList(
fileInput(ns("file1"), "Choose CSV File", accept = ".csv"),
checkboxInput(ns("header"), "Header", TRUE),
tableOutput(ns("contents"))
)
}
importSE <- function(id) {
moduleServer(id,
function(input, output, session) {
dtreact <- reactive({
file <- input$file1
if (is.null(file))
return(NULL)
read.csv(file$datapath, header = input$header)
})
output$contents <- renderTable({
dtreact()
})
return(dtreact)
}
)
}
varselect_ui <- function(id) {
ns <- NS(id)
var_choices <- ""
tagList(selectInput(ns("xvar"), "Select X variable", choices = var_choices, selected = NULL),
selectInput(ns("yvar"), "Select Y variable", choices = var_choices, selected = NULL))
}
varselect_server <- function(id, dataset) {
moduleServer(id,
function(input, output, session) {
observeEvent(dataset(), {
updateSelectInput(session,
"xvar",
choices = names(dataset()))
updateSelectInput(session,
"yvar",
choices = names(dataset()))
})
return(
list(
xvar = reactive({input$xvar}),
yvar = reactive({input$yvar})
)
)
}
)
}
scatterplot_ui <- function(id) {
ns <- NS(id)
plotOutput(ns("plot1"))
}
scatterplot_server <- function(id, dataset, plot1vars, plot2vars) {
moduleServer(id,
function(input, output, session) {
plot1_obj <- reactive({
req(dataset())
p <- scatter_plot(dataset(), xvar = plot1vars(), yvar = plot2vars())
return(p)
})
output$plot1 <- renderPlot({
plot1_obj()
})
}
)
}
ui <- fluidPage(
importUI("import"),
varselect_ui("select"),
scatterplot_ui("scatter")
)
server <- function(input, output, session) {
dataset <- importSE("import")
plotvars <- varselect_server("select", dataset = dataset)
scatterplot_server("scatter", dataset = dataset, plot1vars = plotvars$xvar,
plot2vars = plotvars$yvar)
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)