gpt4 book ai didi

r - 使用来自一个 Shiny 模块的结果/输出来更新另一个模块中的选择输入

转载 作者:行者123 更新时间:2023-12-04 18:24:28 25 4
gpt4 key购买 nike

在弄清楚如何使用新的 Shiny 模块时,我想模拟以下应用程序。当单击和取消单击数据表的行时,它会更新 selectInput 中的条目。框,使用 updateSelectInput .

library(shiny)

## prepare dataframe -----------------------------------------------------------
df <- mtcars
df$model <- rownames(df)
rownames(df) <- NULL
df <- df[1:10, c(12, 1:5)]
car_names <- data.frame(df$model)


## app -------------------------------------------------------------------------
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
selectInput('car_input', 'Select car:', df$model, multiple = TRUE)
),
mainPanel(
DT::dataTableOutput('table')
)
)
)

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

output$table <- DT::renderDataTable(df)
car_rows_selected <- reactive(car_names[input$table_rows_selected, ])
observe({ updateSelectInput(session, 'car_input', selected = car_rows_selected()) })

}

shinyApp(ui = ui, server = server)

我已经完成了大部分工作,但是在更新输入框时遇到了困难。我想知道它是否与命名空间的工作方式有关,并且可能需要对 Car 模块中的 DFTable 模块进行嵌套调用,但我不确定。我可以添加一个 textOutput 元素,该元素打印所选表格行中的预期信息。我的单文件应用程序代码如下:
library(shiny)

## prepare dataframe -----------------------------------------------------------
df <- mtcars
df$model <- rownames(df)
rownames(df) <- NULL
df <- df[1:10, c(12, 1:5)]
car_names <- data.frame(df$model)


## select module ---------------------------------------------------------------
CarInput <- function(id){
ns <- NS(id)
selectInput(ns('car_input'), 'Select car:', df$model, multiple = TRUE)
}

Car <- function(input, output, session, ...) {

# I was thinking perhaps I needed to call the DFTable module as a nested module within this Car module
car_rows_selected <- callModule(DFTable, 'id_inner')
observe({ updateSelectInput(session, 'car_input', selected = car_rows_selected()) })

}


## datatable module ------------------------------------------------------------
DFTableOutput <- function(id){
ns <- NS(id)
DT::dataTableOutput(ns('table'))
}

DFTable <- function(input, output, session, ...){

output$table <- DT::renderDataTable(df)
return(reactive(car_names[input$table_rows_selected, ]))

}


## app -------------------------------------------------------------------------
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
CarInput('id_car'),
textOutput('selected') # NB. this outputs expected values
),
mainPanel(
DFTableOutput('id_table')
)
)
)

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

callModule(Car, 'id_car')
callModule(DFTable, 'id_table')

output$selected <- callModule(DFTable, 'id_table') # NB this works as expected (see textOutput in ui section above)

car_rows_selected <- callModule(DFTable, 'id_table')
observe({ updateSelectInput(session, 'car_input', selected = car_rows_selected()) })

}

shinyApp(ui = ui, server = server)

任何帮助将不胜感激

最佳答案

好的,更多的尝试和错误让我得到了正确的答案 - car_rows_selected需要给项目提供双箭头<<-应用服务器函数中的运算符,以便在 Car 中使用它模块:查找 car_rows_selected <<- callModule(DFTable, 'id_table')在服务器功能中

library(shiny)

## prepare dataframe -----------------------------------------------------------
df <- mtcars
df$model <- rownames(df)
rownames(df) <- NULL
df <- df[1:10, c(12, 1:5)]
car_names <- data.frame(df$model)

## select module ---------------------------------------------------------------
CarInput <- function(id){
ns <- NS(id)
selectInput(ns('car_input'), 'Select car:', df$model, multiple = TRUE)
}

Car <- function(input, output, session, ...) {

observe({ updateSelectInput(session, 'car_input', selected = car_rows_selected()) })

}


## datatable module ------------------------------------------------------------
DFTableOutput <- function(id){
ns <- NS(id)
DT::dataTableOutput(ns('table'))
}

DFTable <- function(input, output, session, ...){

output$table <- DT::renderDataTable(df)
reactive(car_names[input$table_rows_selected, ])

}


## app -------------------------------------------------------------------------
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
CarInput('id_car')
),
mainPanel(
DFTableOutput('id_table')
)
)
)

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

callModule(Car, 'id_car')
car_rows_selected <<- callModule(DFTable, 'id_table')

}

shinyApp(ui = ui, server = server)

我仍然对模块命名空间的工作方式有所了解 - 也许这不是最“正确”的方法,但至少它有效 - 如果有人稍后发布一个更合适的答案,我很乐意接受

关于r - 使用来自一个 Shiny 模块的结果/输出来更新另一个模块中的选择输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36935945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com