我有一个在利用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)
答案 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