I have a Shiny app with two modules and a user defined function:
The app throws error Warning: Error in user_function: could not find function "user_function"
and I can't figure out why. Any help and explanation would be much appreciated !
Below is the minimum example code.
first_module.R
#Define ui
first_module_ui <- function(id) {
ns <- NS(id)
tagList(
numericInput(
inputId = ns("first_input_1"),
label = "Input 1:",
value = 1
),
numericInput(
inputId = ns("first_input_2"),
label = "Input 2:",
value = 2
)
)
}
#Define server logic
first_module_server <- function(input, output, session) {
return(input)
}
user_function.R
#User defined function
user_function <- function(first_module_res) {
function_result_1 <- reactive({first_module_res$first_input_1 + 1})
function_result_2 <- reactive({first_module_res$first_input_2 + 1})
return(
list(
function_result_1 = function_result_1,
function_result_2 = function_result_2
)
)
}
second_module.R
#Define ui
second_module_ui <- function(id) {
ns <- NS(id)
tagList(uiOutput(outputId = ns("second_input_1")),
uiOutput(outputId = ns("second_input_2")))
}
#Define server logic
second_module_server <- function(input, output, session, function_result) {
ns <- session$ns
function_result_1 <- reactive({function_result$result_1 + 1})
output$second_input <- renderUI({
disabled(textInput(
inputId = ns("second_input_1"),
label = "Second input 1:",
value = function_result_1()
))
})
function_result_2 <- reactive({function_result$result_2 + 1})
output$second_input_2 <- renderUI({
disabled(textInput(
inputId = ns("second_input_2"),
label = "Second input 2:",
value = function_result_2()
))
})
return(
list(reactive({second_input_1()}),
reactive({second_input_2()}))
)
}
app.R
library(shiny)
library(shinyjs)
# Define UI
ui <- fluidPage(
useShinyjs(),
# Application title
titlePanel("Demo"),
# Sidebar
sidebarLayout(
sidebarPanel(
first_module_ui("first")
),
mainPanel(
second_module_ui("second")
)
)
)
# Define server logic
server <- function(input, output, session) {
first_module_res <- callModule(first_module_server, "first")
observe(
function_result <- user_function(first_module_res),
second_module_res <- callModule(second_module_server, "second", function_result)
)
}
# Run the application
shinyApp(ui = ui, server = server)
You have 2 errors in your code:
observe
. If you use observe
, you should also enclose the expression into curly braces. However, you also have a comma in the observe
which leads to the errorfunction_result$function_result_1()
instead of function_result$result_1()
Also, I named the output IDs of the UI elements differently than the input IDs, I think otherwise it is not good style.
second_module.R
#Define ui
second_module_ui <- function(id) {
ns <- NS(id)
tagList(uiOutput(outputId = ns("UI_second_input_1")),
uiOutput(outputId = ns("UI_second_input_2")))
}
#Define server logic
second_module_server <- function(input, output, session, function_result) {
ns <- session$ns
function_result_1 <- reactive({
function_result$function_result_1() + 1})
output$UI_second_input_1 <- renderUI({
disabled(textInput(
inputId = ns("second_input_1"),
label = "Second input 1:",
value = function_result_1()
))
})
function_result_2 <- reactive({function_result$function_result_2() + 1})
output$UI_second_input_2 <- renderUI({
disabled(textInput(
inputId = ns("second_input_2"),
label = "Second input 2:",
value = function_result_2()
))
})
return(
list(reactive({second_input_1()}),
reactive({second_input_2()}))
)
}
app.R
library(shiny)
library(shinyjs)
# Define UI
ui <- fluidPage(
useShinyjs(),
# Application title
titlePanel("Demo"),
# Sidebar
sidebarLayout(
sidebarPanel(
first_module_ui("first")
),
mainPanel(
second_module_ui("second")
)
)
)
# Define server logic
server <- function(input, output, session) {
first_module_res <- callModule(first_module_server, "first")
function_result <- user_function(first_module_res)
second_module_res <- callModule(second_module_server, "second", function_result)
}
# Run the application
shinyApp(ui = ui, server = server)