Модули в отдельных файлах server.R и ui.R - PullRequest
0 голосов
/ 19 сентября 2019

Можно ли создавать модули в Shiny App, записанном в отдельных файлах app.R, server.R и ui.R?

Все примеры, которые я нашел, представляют собой один файл app.R со встроенным сервером и функциями пользовательского интерфейса. См. пример 1 , пример 2 !, пример 3 !

(я взял код из этого последнего примера для этого теста).

Я пытался запустить это приложение:

app.R

library(shiny)

# load module functions
source("hello_world.R")

# Run the application 
shinyApp(ui = ui, server = server)

ui.R

#ui.R

library(shiny)
#source("hello_world.R")
ui <- fluidPage(

  titlePanel("Using of Shiny modules"),

  fluidRow(
    # Call interface function of module "hello_world"
    hello_worldUI(id = "id_1")
  )

)

server.R

#server.R

library(shiny)
source("hello_world.R")


server <- function(input, output, session) {

  # Call logic server function of module "hello_world"
  callModule(module = hello_world, id = "id_1")

}

# UPDATE! -> my Error comes from this line of code  in server.R file: 
#shinyApp(ui = ui, server = server) 
#Removing the line above solve the problem. 

hello_world.R

#module 1: hello_world

# Function for module UI
hello_worldUI <- function(id) {
    ns <- NS(id)

    fluidPage(
        fluidRow(
            column(2, textInput(ns("TI_username"), label = NULL, placeholder = "your name")),
            column(2, actionButton(ns("AB_hello"), label = "Hello !"))
        ),
        hr(),
        fluidRow(
            column(12, textOutput(ns("TO_Hello_user")))
        )
    )

}

# Function for module server logic
hello_world <- function(input, output, session) {

    # When user clicks on "Hello" button : Update reactive variable "name"
    name <- eventReactive(input$AB_hello, {
        return(input$TI_username)
    })

    # Show greetings
    output$TO_Hello_user <- renderText({
        if (name() %in% "") {
            return("Hello world !")
        } else {
            return(paste("Hello", name(), "!"))
        }
    })

}

Но я получил эту ошибку:

Предупреждение: ошибка в силе: объект 'ui' не найден
52: сила
51: uiHttpHandler
50: sparkApp
Ошибка в действии (ui): объект 'ui' не найден

1 Ответ

0 голосов
/ 19 сентября 2019

Объекты ui и server не известны приложению, если вы не определите их в одном и том же файле, и они будут сгенерированы во время выполнения, или вы явно вызовите их из внешних файлов до shinyApp().Измените app.R, как показано ниже, и оно должно работать:

library(shiny)

# load module functions
source("hw.R")
# load ui elements
source("ui.R")
# load server function
source("serv.R")

# Run the application 
shinyApp(ui = ui, server = server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...