rHandsonTable模块从另一个tabPanel调用时返回NULL

时间:2019-07-30 21:33:10

标签: r module shiny rhandsontable

我有一个在利用rHandsonTableOutput的模块中利用tabPanel(HoT)的应用程序。虽然由于某种原因我可以从该模块中获取其他数据(例如,在selectInput中进行选择),但在尝试获取HoT数据时却得到了NULL。我编写了一个非常简单的代码版本,以显示我的意思。

如果将模块放在同一UI元素中,我发现HoT数据可访问。由于某种原因,如果我将其放在tabPanel的另一个选项卡中,它将无法返回数据。我的示例代码应在此处显示。

更新-我发现只要单击并首先将有问题的HoT加载到选项卡中,模块就可以工作!首先,有关“查看”选项卡的问题似乎可以解决此问题。我很想找到一种无需这样做的方法。这与rshiny的“会话”有关吗?

下面是应重现该错误的代码。您将找到一个带有两个HoT的简单应用程序。主选项卡通过模块myModuleUI插入了一个。第二个下拉选项卡包含一个通过第二个模块HoT生成的第二个myModuleTabUI。它们相同,除了myModuleTabUI将所有内容都放在tabPanel中。如果您按下“添加表格按钮”,它只会将表格中的数字相加,但是对于ID为 first_tab HoT(即{{1} })。


其中包含主要的闪亮应用

应用程序。R

HoT

此文件包含此示例中使用的模块:

my_modules.R

library(shiny)
library(rhandsontable)

source('my_modules.R')

ui <- navbarPage("Module Test Tool",

             tabsetPanel(id = 'mainTabset',
                         tabPanel("My Tab",

                                  #This is the HoT that is accessible from a module
                                  h4("Table 1"),
                                  myModuleUI('my_module'), 
                                  br(),
                                  br(),

                                  fluidRow(
                                    actionButton("sum_btn", "Add table data"),
                                    br(),
                                    br(),
                                    textOutput('table1_sum'),
                                    textOutput('table2_sum'),
                                    br(),
                                    br()
                                  )
                         ),
                         navbarMenu("My Module Tabs",
                                    #This is the HoT that is inaccessible from a module
                                    myModuleTabUI('first_tab', 'First')

                         )
             )

)


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

  #Link logic for tab module
  callModule(myModule, 'my_module')
  callModule(myModuleTab, 'first_tab')

  one_col = rep.int(1,3)
  df = data.frame(col1 = one_col,
                  col2 = one_col,
                  col3 = one_col)

  output$hot <- renderRHandsontable({
    rhandsontable(df, stretchH = "none", rowHeaders = NULL)
  })


  #This button sums up all the rHandsonTable data frames
  observeEvent(input$sum_btn, {

    #Works just fine when not pulling from the same panel's module
    module_data = callModule(getMyModuleData, 'my_module')
    module_int= module_data$module_int
    module_df = module_data$module_hot

    output$table1_sum = renderText({
      paste0("Sum of Table 1 is: ", sum(module_df)," | Integer one is: ", module_int)
    })

    #Fails when pulling a hands on table from another tab
    module_tab_data = callModule(getMyModuleTabData, 'first_tab') #<---THIS LINE FAILS
    module_tab_int= module_tab_data$module_tab_int
    module_tab_df = module_tab_data$module_tab_hot 

    output$table2_sum = renderText({
      paste0("Sum of the table in the 'First' tab is: ", sum(module_tab_df)," | Integer in 'First' tab is: ", module_tab_int)
    })

  })


}

## Create Shiny app ----
shinyApp(ui, server)

1 个答案:

答案 0 :(得分:1)

请编辑以下几行:

#Fails when pulling a hands on table from another tab
module_tab_dat = callModule(getMyModuleTabData, 'first_tab') #<---THIS LINE FAILS
module_tab_int= module_tab_dat$module_tab_int
module_tab_df = module_tab_dat$module_tab_hot

您有:

module_tab_int= module_data$module_tab_int
module_tab_df = module_data$module_tab_hot 

但是您将模块命名为module_tab_dat。我认为是复制粘贴错误。

更新

关于您的更新,请在您的模块代码中添加以下行:

output$module_tab_hot <- renderRHandsontable({
    rhandsontable(df, stretchH = "none", rowHeaders = NULL)
  })
# Added line
outputOptions(output, "module_tab_hot", suspendWhenHidden = FALSE)

恰当地命名为suspendWhenHidden的默认值为TRUE,这在大多数情况下可能是正确的。在这种情况下,它必须为FALSE。参见here