如何将R闪亮应用程序分解为模块?

如何将R闪亮应用程序分解为模块?,r,shiny,R,Shiny,因此,在我之前的一篇文章中,我遇到了一个关于如何恢复书签和运行模型的问题。这只是一个可复制的示例,但作为一个应用程序,我希望随着应用程序的大小不断增加,将其模块化。我有下面的代码。在模块1中,我想调用以呈现数据表,并在用户单击书签时调用模块2。模块2的代码位于服务器部分。如何将此应用程序模块化 “一个闪亮应用的用例,用户可以在其中输入一些值,当单击run时,它将运行一个模型并在表中显示值。现在,当我点击书签时,它会捕获输入值。当我点击restore书签时,它会填充输入值。我想做的是在它恢复输入值

因此,在我之前的一篇文章中,我遇到了一个关于如何恢复书签和运行模型的问题。这只是一个可复制的示例,但作为一个应用程序,我希望随着应用程序的大小不断增加,将其模块化。我有下面的代码。在模块1中,我想调用以呈现数据表,并在用户单击书签时调用模块2。模块2的代码位于服务器部分。如何将此应用程序模块化

“一个闪亮应用的用例,用户可以在其中输入一些值,当单击run时,它将运行一个模型并在表中显示值。现在,当我点击书签时,它会捕获输入值。当我点击restore书签时,它会填充输入值。我想做的是在它恢复输入值之后,它还应该再次运行模型并填充表中的值。简而言之,restore bookmark应该填充这些值,然后单击run按钮来运行模型。”

库(闪亮)
图书馆(RSQLite)
库(数据表)
图书馆(DT)
图书馆(dplyr)
####模块1呈现第一个表

opFunc不幸的是,提供的代码既不完全可复制,也不最少,因此我继续尝试剥离我认为不必要的内容,并从您的另一篇文章中添加了
df
。我还将模块服务器名称从
opFunc
更改为
tableMod
,因为尝试使用具有不同UI和服务器名称的模块:)

以下代码按预期工作

library(shiny)
library(DT)
library(dplyr)

#### Module 1 renders the first table
tableMod <- function(input, output, session, modelRun,modelData,budget){

  output$x1 <- DT::renderDataTable({
    modelRun()
    isolate(
      datatable(
        modelData %>% 
          mutate(Current  = as.numeric(Current)*(budget())),
        selection = 'none', editable = TRUE
      )
    )
  })
}
tableUI <- function(id) {
  ns <- NS(id)
  dataTableOutput(ns("x1"))
}

ui <- function(request) {
  fluidPage(
    tableUI("opfun"),
    numericInput("budget_input", "Total Forecast", value = 2),
    textInput(inputId = "description", "Bookmark description"),
    bookmarkButton(id="bookmarkBtn"),
    actionButton("opt_run", "Run")
  )
}

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

  df <- data.frame(Channel = c("A", "B","C"),
                   Current = c(2000, 3000, 4000),
                   Modified = c(2500, 3500,3000),
                   New_Membership = c(450, 650,700),
                   stringsAsFactors = FALSE)

  callModule( tableMod,"opfun",
              modelRun = reactive(input$opt_run),
              modelData = df,
              budget = reactive(input$budget_input))

  observeEvent(input$opt_run, {
    cat('HJE')
  })

  setBookmarkExclude("bookmarkBtn")
  observeEvent(input$bookmarkBtn, {
    session$doBookmark()
  })
}

shinyApp(ui, server, enableBookmarking = "url")
库(闪亮)
图书馆(DT)
图书馆(dplyr)
####模块1呈现第一个表

tableMod不幸的是,提供的代码不是完全可复制的,也不是最小的,因此我继续尝试剥离我认为不必要的内容,并从您的另一篇文章中添加了
df
。我还将模块服务器名称从
opFunc
更改为
tableMod
,因为我很难尝试使用它具有不同UI和服务器名称的模块:)

以下代码按预期工作

library(shiny)
library(DT)
library(dplyr)

#### Module 1 renders the first table
tableMod <- function(input, output, session, modelRun,modelData,budget){

  output$x1 <- DT::renderDataTable({
    modelRun()
    isolate(
      datatable(
        modelData %>% 
          mutate(Current  = as.numeric(Current)*(budget())),
        selection = 'none', editable = TRUE
      )
    )
  })
}
tableUI <- function(id) {
  ns <- NS(id)
  dataTableOutput(ns("x1"))
}

ui <- function(request) {
  fluidPage(
    tableUI("opfun"),
    numericInput("budget_input", "Total Forecast", value = 2),
    textInput(inputId = "description", "Bookmark description"),
    bookmarkButton(id="bookmarkBtn"),
    actionButton("opt_run", "Run")
  )
}

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

  df <- data.frame(Channel = c("A", "B","C"),
                   Current = c(2000, 3000, 4000),
                   Modified = c(2500, 3500,3000),
                   New_Membership = c(450, 650,700),
                   stringsAsFactors = FALSE)

  callModule( tableMod,"opfun",
              modelRun = reactive(input$opt_run),
              modelData = df,
              budget = reactive(input$budget_input))

  observeEvent(input$opt_run, {
    cat('HJE')
  })

  setBookmarkExclude("bookmarkBtn")
  observeEvent(input$bookmarkBtn, {
    session$doBookmark()
  })
}

shinyApp(ui, server, enableBookmarking = "url")
库(闪亮)
图书馆(DT)
图书馆(dplyr)
####模块1呈现第一个表

tableMod感谢您发布另一个问题。老实说,这段代码有点太多,很难将肉与其他部分分开。我会尝试先将您的代码减少到只包含基本内容,以便其他人更容易参与进来并提供帮助。现在这不是很简单,看起来有点太难处理e!我已经尝试减少删除所有数据库组件的代码,书签保存到的datatable。希望这是一个简单的示例。谢谢。谢谢你发布另一个问题。老实说,这段代码中有点太多内容,很难将这些内容与其他内容分开。我会尝试先删除down您的代码只包含最基本的内容,这样其他人就可以更容易地参与进来并提供帮助。目前它还不是很简单,看起来有点太难处理!我已经尝试减少代码,从中删除所有数据库组件,书签保存到的数据表。希望这是一个最简单的示例。谢谢。Th谢谢。我注意到在当前示例中,
opt_run=1
的值。当我试图通过将书签值写入数据库来复制此值时,书签URL具有
opt_run=0
。任何可能发生这种情况的原因。如果没有看到代码,我真的不知道。我的答案是直接解决p中的问题ost,因此,如果它不能解决您的实际用例,您需要投入一点时间来制作一个可复制的示例,以显示您在应用程序中遇到的确切问题。无法调试我们看不到的应用程序,因此我尝试使用您的示例。如果您不单击并运行并保存书签,则
opt_run=0
。但是如果您单击run并保存书签,然后单击“opt_run=1”,这很有意义,听起来像是正确的行为。输入按钮的值是它被按下的次数。如果您单击按钮3次,它的值将为3谢谢您。我注意到在当前示例中,
opt_run=1
的值。当我尝试通过写复制此值时将书签值添加到数据库书签URL有
opt_run=0
。任何可能发生这种情况的原因。如果没有看到代码,我真的不知道。我的答案是文章中问题的直接解决方案,因此如果它不能解决您的实际用例,您需要投入一点时间来提出一个可复制的示例at显示了您的应用程序中存在的确切问题。无法调试我们看不到的应用程序,因此我尝试了您的示例。如果您不单击并运行并保存书签,则
opt_run=0
。但是如果您单击并保存书签,则“opt_run=1”是有意义的,听起来是正确的行为。输入值tton是按下按钮的次数。如果单击按钮3次,则值为3