考虑任何shiny 的模块,其中我们在服务器部分使用session$ns,例如下面的那个.

我们可以用NS(id)代替session$ns.那么,为什么推荐使用session$ns呢?比NS(id)有优势吗?

library(shiny)

myModuleUI <- function(id){
  ns <- NS(id)
  uiOutput(ns("checkbox"))
}

myModuleServer <- function(id){
  moduleServer(id, function(input, output, session){
    ns <- session$ns
    output[["checkbox"]] <- renderUI({
      checkboxInput(ns("checkbox"), label = "Check me", value = FALSE)
    })
    observe({
      print(input[["checkbox"]])
    })
  })
}

ui <- basicPage(
  myModuleUI("myModule")
)

server <- function(input, output, session){
  myModuleServer("myModule")
}

shinyApp(ui, server)

推荐答案

如果我理解正确,这是由于shiny 1.5.0之前模块API的 struct .在此之前,您必须以以下方式编写模块server函数:

myModuleServer <- function(input, output, session){
  ns <- session$ns
  output[["checkbox"]] <- renderUI({
    checkboxInput(ns("checkbox"), label = "Check me", value = FALSE)
  })
  observe({
    print(input[["checkbox"]])
  })
}

并使用以下命令调用模块:

callModule(myModuleServer, id = "myModule")

使用此API,您的模块server函数没有id变量,您必须求助于session$ns.这在"Using renderUI within modules" part of the shiny tutorial中仍然(错误地)提到了.

如果renderUI块本身包含输入/输出,则需要使用ns()来包装ID参数,就像上面的示例一样.但是这些ns实例是使用NS(Id)创建的,在本例中,没有id参数可用.怎么办呢? 会话参数可以为您提供ns;只需调用ns<;-Session$ns即可.这将把ID放在与会话相同的名称空间中.

对于新的API来说,上述情况不再适用.

事实上,在Mastering Shiny中,他们也在模块的server部分使用NS(id).

然而,我不确定在使用新API的模块server中使用NS(id)session$ns之间是否有任何细微的区别(但考虑到"精通shiny "使用它,我不这么认为).

R相关问答推荐

大规模重新标记haven标签数据

更改默认系列1以更改名称

如果可能,将数字列转换为整数,否则保留为数字

多个模拟序列间的一种预测回归关系

根据列A中的差异变异列,其中行由列B中的相对值标识

比较理论阿尔法和经验阿尔法

如何指定我的函数应该查找哪个引用表?

从R中的对数正态分布生成随机数的正确方法

R -使用矩阵reshape 列表

使用未知字符数(不受限制的最大长度)的Lookback有什么好的替代方案?

使用来自嵌套列和非嵌套列的输入的PURRR:MAP和dplyr::Mariate

以不同于绘图中元素的方式对GG图图例进行排序

将统计检验添加到GGPUBR中的盒图,在R

如何获取R chromote中的当前URL?

子样本间系数检验的比较

组合名称具有模式的列表的元素

如何在一种 colored颜色 中设置数值变量的 colored颜色 和高于阈值的 colored颜色 点?

Data.table条件合并

创建由三个单独的shapefile组成的单个 map

仅在Quarto中运行块的一部分