使用lapply和insertUI的重复发光模块的顺序
我创建了一个(出于演示目的,可复制)闪亮的应用程序,用户界面通过单击“加载”按钮创建一些数据(使用lapply和insertUI的重复发光模块的顺序,r,shiny,shinyapps,shiny-reactivity,shinymodules,R,Shiny,Shinyapps,Shiny Reactivity,Shinymodules,我创建了一个(出于演示目的,可复制)闪亮的应用程序,用户界面通过单击“加载”按钮创建一些数据(DataPack)(一个包含两个元素的列表)。此列表的每个元素都是通过模块在服务器功能中使用lappy绘制的 然而,该应用程序工作正常,绘图的顺序是相反的(DataPack$twowithrnorm(n)^2在DataPack$onewithrnorm(n))之前),但预期显示为called(lappy(名称(DataPack()),函数(DataSetName){…})。如何按照给定的顺序修复此/重复
DataPack
)(一个包含两个元素的列表)。此列表的每个元素都是通过模块在服务器
功能中使用lappy
绘制的
然而,该应用程序工作正常,绘图的顺序是相反的(DataPack$two
withrnorm(n)^2
在DataPack$one
withrnorm(n)
)之前),但预期显示为called(lappy(名称(DataPack()),函数(DataSetName){…}
)。如何按照给定的顺序修复此/重复调用模块,以及对该行为的解释是什么
library(shiny)
library(TTR)
Module_ui <- function(id) {
ns <- shiny::NS(id)
shiny::uiOutput(ns("Plot"))
}
Module_Server <- function(
input, output, session,
DataPack, DataSetName, InputButton_GetData, xlim) {
AnalysedPack <- eventReactive(c(
InputButton_GetData(),
input$InputButton_ProcessData), {
message(paste("Analysed Pack", DataSetName))
AnalysedPack <-
runMean(DataPack()[[DataSetName]],
min(input$NumericInput_BW,
length(DataPack()[[DataSetName]])))
return(AnalysedPack)
})
output[['Plot']] <- renderUI({
ns <- session$ns
tags$div(
id = environment(ns)[['namespace']],
tagList(
fluidRow(
column(2, column(12, fluidRow(
numericInput(
inputId = ns("NumericInput_BW"),
label = NULL,
min = 1,
max = 100,
value = 10,
step = 1))),
fluidRow(
column(12, actionButton(
ns("InputButton_ProcessData"),
"Process", width = "100%")))),
column(10,
renderPlot({
message(paste("Base_Plot", DataSetName))
plot(DataPack()[[DataSetName]],
xlim = c(xlim()[1],
xlim()[2]))
lines(AnalysedPack(),
col = "tomato", lwd = 2)
}) ) )
)
)
})
}
ui <- fluidPage(
fluidRow(
column(
6,
column(
12,
fluidRow(h4("Data Generation")),
fluidRow(actionButton(
"InputButton_GetData", "Load", width = "100%")))),
column(
6,
column(
12,
fluidRow(h4("Update Plot")),
sliderInput(
"SliderInput_xAxis",
label = NULL,
min = 0,
max = 150,
value = c(0, 150),
animate = TRUE)
)
),
column(12, actionButton('addButton', '', icon = icon('plus')))
)
)
server <- function(input, output, session) {
DataPack <- eventReactive(
input$InputButton_GetData, {
message("DataPack")
n <- round(runif(1, min = 100, max = 500))
message(n)
DataPack <- NULL
DataPack$one <- rnorm(n)
DataPack$two <- rnorm(n)^2
updateSliderInput(
session = session,
inputId = "SliderInput_xAxis",
value = c(1, n),
min = 1,
max = n)
return(DataPack)
})
SliderInput_xAxis_rx <-
reactive(input$SliderInput_xAxis)
InputButton_GetData_rx <-
reactive(input$InputButton_GetData)
observeEvent(input$InputButton_GetData, {
lapply(names(DataPack()), function(DataSetName) {
id <- sprintf('Plot%s', DataSetName)
insertUI(
selector = "#addButton",
where = "afterEnd",
ui = Module_ui(id)
)
callModule(
Module_Server, id,
DataPack = DataPack,
DataSetName = DataSetName,
InputButton_GetData = InputButton_GetData_rx,
xlim = SliderInput_xAxis_rx)
})
})
}
shinyApp(ui, server)
库(闪亮)
图书馆(TTR)
模块ui此代码:
insertUI(
selector = "#addButton",
where = "afterEnd",
ui = Module_ui(id)
)
在元素#addButton
后插入UI。因此,第一个调用生成示意图:
#添加按钮
ui1
第二个调用作为第一个调用,在#addButton
之后插入,而不是在ui1
之后插入:
#添加按钮
ui2
ui1
所以,把名字倒过来。事实上很明显:D谢谢!