在shiny中动态添加模块

2023-12-12

这与使用 renderUI 创建模块无关。 据我了解,使用 renderUI,您可以在 UI 函数中放置一个占位符,然后在服务器函数中编写控件/小部件。

模块分为两部分。您必须使用 callModule() 将一部分添加到 UI 函数,将另一部分添加到服务器函数。

我有一个滑块模块。我想在单击“添加”操作按钮时将其添加到井面板中。如果它有帮助,您可以考虑在单击按钮时多次复制模块。重复的模块应该都是独立的。

Visually

dynamically loading modules

我想知道操作按钮如何在 UI 函数内添加模块的 UI 部分,在服务器函数内添加服务器部分。

#Dynamically adding modules
library(shiny)

#slider module ------------------------
sliderUI <- function(id) {
  ns <- NS(id)
  sliderInput(ns("bins"), "Number of Bins:", min = 1, max = 5, value = 3)
}

slider <- function(input, output, session) {}


#shiny app ------------------------
ui <- fixedPage(
  fixedRow(
    column(width = 4, wellPanel(
      h4("Slider Module"),
      sliderUI("slider"),
      actionButton("addSliderModule", "Add Slider Module"))
    ),
    column(width = 4, wellPanel(
      h4("Dynamic Loading Modules"),
      p("Clicking on the 'Add' button on the left should add the module here. You should be able to duplicate that slider module as many times as the button is clicked"),
  hr())
    )
  )
)

server <- function(input, output, session) {
   observeEvent(input$addSliderModule, {
      #what goes here
   })
}

shinyApp(ui, server)

交叉发布于闪亮组


好的,这是您的解决方案。我很高兴我找到了一个,因为我花了几个小时。

基本上,如果您想从无到有(无渲染函数)添加模块,则必须通过 JavaScript。这分为三个步骤:

  • 创建 HTML 元素
  • 使用 ionrangeslider.js 库将其注册为滑块
  • 创建闪亮的回调

如果你打电话inputSlider来自 Shiny,这三个都为您完成。但如果没有它,我们就必须独自完成这些事情。好事,如果你知道该怎么做,这并不难。

我的代码的重要部分发生在script。我在那里创建了元素(您之前在函数中尝试过的内容)sliderUI),然后致电ionRangeSlider,让它看起来像一个真正的滑块,最后,Shiny.unbindAll() / Shiny.bindAll()创建对应的绑定input多变的。

其他添加仅用于说明。

Enjoy!

Code:

library(shiny)

  ui <- fixedPage(
  fixedRow(
    column(width = 4, wellPanel(
      h4("Slider Module"),
      tags$div(
        sliderInput("slider-bins", "Number of Bins:", min = 1, max = 5, value = 3)
      ),
      actionButton("addSliderModule", "Add Slider Module"))
    ),
    column(width = 4, wellPanel(id = "target",
      h4("Dynamic Loading Modules"),
      p("Clicking on the 'Add' button on the left should add the module here. You should be able to duplicate that slider module as many times as the button is clicked"),
      hr(),

      tags$script('
        Shiny.addCustomMessageHandler("createSlider",
          function(ID) {
            Shiny.unbindAll();

            var targetContainer = document.getElementById("target");

            var container = document.createElement("div");
            container.setAttribute("class", "form-group shiny-input-container");

            var label = document.createElement("label");
            label.setAttribute("class", "control-label");
            label.setAttribute("for", "ID");

            var labelText = document.createTextNode("Number of Bins");

            label.appendChild(labelText);
            container.appendChild(label);

            var input = document.createElement("input");
            input.setAttribute("class", "js-range-slider");
            input.setAttribute("id", ID);
            input.setAttribute("data-min", "1");
            input.setAttribute("data-max", "5");
            input.setAttribute("data-from", "3");
            input.setAttribute("data-step", "1");
            input.setAttribute("data-grid", "true");
            input.setAttribute("data-grid-num", "4");
            input.setAttribute("data-grid-snap", "false");
            input.setAttribute("data-prettify-separator", ",");
            input.setAttribute("data-keyboard", "true");
            input.setAttribute("data-keyboard-step", "25");
            input.setAttribute("data-drag-interval", "true");
            input.setAttribute("data-data-type", "number");

            container.appendChild(input);

            targetContainer.appendChild(container);

            $("#" + ID).ionRangeSlider();

            Shiny.bindAll();
          }
        );'
      )
    )),
    column(width = 4, wellPanel(
      uiOutput("response") 
    ))
  )
)

server <- function(input, output, session) {
  observeEvent(input$addSliderModule, {
    session$sendCustomMessage(type = "createSlider", message = paste0("slider-", input$addSliderModule))
  })
  output$response <- renderUI({
    if(input$addSliderModule >0){

      lapply(1:input$addSliderModule, function(x){

        output[[paste("response", x)]] <- renderText({paste("Value of slider", x, ":", input[[paste0("slider-", x)]])})

        textOutput(paste("response", x))
      })
    }
  })
}

runApp(shinyApp(ui, server))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在shiny中动态添加模块 的相关文章

  • 将函数应用于矩阵列表

    我有一个矩阵列表 注意 它们的维度与此示例不同 x lt matrix 1 10 ncol 2 y lt x 300 mylist lt list x y 我想运行一个函数networklevel在矩阵列表中的每个矩阵上 该函数有各种可以计
  • 如何从R中串扰的filter_select中删除(全部)?

    我遵循图 16 7 的示例https plotly r com client side linking html https plotly r com client side linking html并且无法弄清楚为什么有一个名为 全部 的
  • 如何上下移动字符串并从中删除相似的字符串?

    我问了一个可能不太清楚的问题 所以我尝试用一 种可以理解的方式来解释它 这是我的数据 我的数据看起来像这样 看起来像这样 V1 V2 V3 1 Q9UNZ5 Q9Y2W1 2 Q9ULV4 Q6QEF8 3 Q9UNZ5 4 Q9H6F5
  • 在 R 中安全地计算算术表达式?

    Edit 好吧 由于似乎有很多混乱 我将稍微简化一下问题 您可以尝试回答下面的原始问题 或者您可以解决此版本并忽略该行下面的所有内容 我的目标是采用任意表达式并在极其受限的环境中对其进行评估 该环境将仅包含具有以下类型值的变量 数值向量 接
  • mlogit:需要 TRUE/FALSE 时缺少值

    我有来自离散选择实验 DCE 的数据 该实验研究了来自不同行业的个人的招聘偏好 我已经格式化为长格式 我想使用 mlogit 进行建模 我已导出数据 并且可以使用 asclogit 命令在 Stata 中成功运行模型 但在 R 中运行时遇到
  • 配置 fix() 和 edit() 以从 R/RStudio 在 Notepad++ 中打开

    当我在 RStudio 或 RGUI 中执行此操作时 fix SomeFunction 或使用edit 我可以在记事本中看到该函数的代码 有什么方法可以更改此设置 以便代码预览在 Notepad 中打开 而不是在普通的旧记事本中打开 同样
  • ggsubplot 是否适用于 R 3.2.1+?

    CRAN 提供的 ggsubplot 版本与 R 的最新版本 例如 3 1 1 不兼容 运行 ggsubplot 示例会返回以下错误 Error in layout base data vars drop drop At least one
  • 正则表达式提取美国邮政编码,但不提取假代码

    使用 XML 包和 XPath 从网站上抓取地址 有时我只能得到一个嵌入了我想要的邮政编码的字符串 提取邮政编码很简单 但有时会显示其他五位数字的字符串 以下是 df 中问题的一些变体 zips lt data frame id seq 1
  • 如何在 R Markdown 中的内联 LateX 方程中输出 R 变量的值(即动态更新)

    我无法找到一种方法将 r 代码实现到 R markdown 中的内联 LateX 方程中 目标是如果变量 值 发生变化 则不必对它们的值进行硬编码 Given values lt c 1 4 2 5 7 9 avg lt sum value
  • 行方向变异的有效方法

    我有两个数据框 dfUsers and purchases使用以下代码生成 set seed 1 library data table dfUsers lt data table user letters 1 5 startDate sam
  • R 中的点图每行有多个值

    我有以下 R 输入文件 car 1 car 2 car 3 car2 1 car2 2 car2 3 然后 我使用以下命令来绘制图表 autos data 点图 autos data V2 autos data V1 但这将每个汽车和 ca
  • 如何通过组度量的平均值在 df 内排列 dplyr:: 组?

    借鉴吴卡拉的设计https stackoverflow com a 26555424 9350837 https stackoverflow com a 26555424 9350837答案 我希望根据各个组汇总测量的平均值对分组 df 进
  • R,igraph,是否可以用图案填充顶点

    使用 R 和 igraph 绘制图形 我使用颜色来标记顶点类型 请参阅下面的代码 是否可以用图案而不是颜色填充顶点 以便在以彩色和黑白查看时可以区分节点类型 我需要 4 种独特的颜色 图案 colorbrewer 中唯一适合的调色板是这个
  • 使用 R SOAP (SSOAP) 检索数据/抓取

    在 B cycle 页面 www bcycle com whowantsitmore aspx 上 我试图抓取投票的位置和值 The URL http mapservices bcycle com bcycleservice asmx ht
  • R 中具有 p 值的相关矩阵

    假设我想要传导相关矩阵 library dplyr data iris iris gt select if is numeric gt cor y iris Petal Width method spearman gt round 2 现在
  • R 无法回忆起内存中的对象

    我正在构建一个包含多个步骤的函数 其中每个步骤都会创建一个对象 某个步骤失败 temp3 并且无法找到前面的步骤对象 错误 未找到对象 temp2 我不知道为什么 我有类似的函数 遵循完全相同的结构 每个步骤都遵循先前创建的对象 在函数内
  • R 获取子字符串和正则表达式?

    我有一组文件名字符串 我想提取 符号之后但文件扩展名之前的所有字符 例如 文件名之一是 HelloWorld you txt 我想返回字符串you 这是我的代码 hashPos grep name fixed TRUE dotPos len
  • R 3.5 - read.csv 无法读取 UTF-16 csv 文件

    我的代码如下 read csv http asic gov au Reports YTD 2018 RR20180420 001 SSDailyYTD csv skip 1 fileEncoding UTF 16 sep t header
  • 如何对范围内的行进行分组并考虑第三列?

    我有一个遗传数据集 我想对基因组中物理上靠近的遗传变异 行进行分组 我想对每条染色体基因组中某些点范围内的基因进行分组 chrom 我的 点 数据集包含变体 行需要在一定范围内的位置 如下所示 chrom low high 1 500 17
  • 如何使用 Facet R 添加线条[重复]

    这个问题在这里已经有答案了 所以我有一个多面图 我希望能够向其中添加随每个面而变化的线 这是代码 p lt ggplot mtcars aes x wt geom histogram bins 20 aes fill factor cyl

随机推荐