Javascript 从数据框或列表中的单选按钮提取用户输入值

Javascript 从数据框或列表中的单选按钮提取用户输入值,javascript,html,r,shiny,Javascript,Html,R,Shiny,我正在用datatable构建一个闪亮的应用程序,它使用一些javascript回调,用户可以为每一行进行选择(是/否/可能),在应用程序的后期,我需要用户以列表或表格的形式输入。确切的行数不是预定义的。理想情况下,我希望对每个用户选择了多少“是”/“否”/“可能”以及如何将哪些行选择为“否”进行总结。我可以将值打印到R终端,但这还不够,值需要保存为对象 下面是我使用的thusfar代码的一个简短示例(基于和) 库(闪亮) 图书馆(DT) 图书馆(shinyWidgets) 我的桌子% 变异(

我正在用datatable构建一个闪亮的应用程序,它使用一些javascript回调,用户可以为每一行进行选择(是/否/可能),在应用程序的后期,我需要用户以列表或表格的形式输入。确切的行数不是预定义的。理想情况下,我希望对每个用户选择了多少“是”/“否”/“可能”以及如何将哪些行选择为“否”进行总结。我可以将值打印到R终端,但这还不够,值需要保存为对象

下面是我使用的thusfar代码的一个简短示例(基于和)

库(闪亮)
图书馆(DT)
图书馆(shinyWidgets)
我的桌子%
变异(
是=sprintf(“”,rowid,是),
否=sprintf(“”,rowid,否),
Maybe=sprintf(“”,rowid,Maybe)
)
shinyApp(
ui=fluidPage(
标题='表中的单选按钮',
DT::dataTableOutput(“datatable”),
行动BTTN(
inputId=“btnProcess”,
label=“进程”,
style=“float”,
size=“sm”,
color=“成功”
),
行动BTTN(
inputId=“btnCancel”,
label=“取消”,
style=“float”,
size=“sm”,
color=“警告”
)#,
#逐字输出('sel')
),
服务器=功能(输入、输出、会话){

dtWithRadioButton您可以在
reactiveValues
中添加一个新变量来存储结果,使用
sapply
input
获取每个唯一
id
的数据,并将其存储在数据框中

library(shiny)
library(DT)
library(shinyWidgets)

my_table <- tibble(
  rowid = letters[1:7],
  val_1 = round(runif(7, 0, 10), 1),
  val_2 = round(rnorm(7), 2),
  Yes   = "Yes",
  No    = "No",
  Maybe = "Maybe"
) %>%
  mutate(
    Yes =  sprintf('<input type="radio" name="%s" value="%s"/>', rowid , Yes),
    No =  sprintf('<input type="radio" name="%s" value="%s"/>', rowid , No),
    Maybe =  sprintf('<input type="radio" name="%s" value="%s"/>', rowid , Maybe)
  )


shinyApp(
  ui = fluidPage(
    title = 'Radio buttons in a table',
    DT::dataTableOutput("datatable"),
    actionBttn(
      inputId = "btnProcess",
      label = "Process",
      style = "float",
      size = "sm",
      color = "success"
    ),
    actionBttn(
      inputId = "btnCancel",
      label = "Cancel",
      style = "float",
      size = "sm",
      color = "warning"
    ),
    dataTableOutput('result')
  ),
  
  server = function(input, output, session) {
    dtWithRadioButton <- reactiveValues(dt = my_table, result = NULL)
    
    
    output$datatable <- renderDT(
      datatable(
        dtWithRadioButton$dt,
        selection = "none",
        escape = FALSE,
        options = list(
          dom = 't',
          paging = FALSE,
          ordering = FALSE
        ),
        callback = JS(
          "table.rows().every(function(i, tab, row) {
                  var $this = $(this.node());
                  $this.attr('id', this.data()[0]);
                  $this.addClass('shiny-input-radiogroup');
                });
                Shiny.unbindAll(table.table().node());
                Shiny.bindAll(table.table().node());"
        ),
        rownames = F
      ),
      server = FALSE
    )
    
    
    observeEvent(input$btnProcess, {
      dt <- dtWithRadioButton$dt 
      dt$result <- sapply(unique(my_table$rowid), function(x) input[[x]])
      dtWithRadioButton$result <- dt
    })
    
    
    observeEvent(input$btnCancel, {
      removeModal(session)
    })
    
    output$result <- renderDT({
      req(dtWithRadioButton$result)
      datatable(dtWithRadioButton$result[c('rowid', 'val_1', 'val_2', 'result')])
    })
  }
)
库(闪亮)
图书馆(DT)
图书馆(shinyWidgets)
我的桌子%
变异(
是=sprintf(“”,rowid,是),
否=sprintf(“”,rowid,否),
Maybe=sprintf(“”,rowid,Maybe)
)
shinyApp(
ui=fluidPage(
标题='表中的单选按钮',
DT::dataTableOutput(“datatable”),
行动BTTN(
inputId=“btnProcess”,
label=“进程”,
style=“float”,
size=“sm”,
color=“成功”
),
行动BTTN(
inputId=“btnCancel”,
label=“取消”,
style=“float”,
size=“sm”,
color=“警告”
),
dataTableOutput('结果')
),
服务器=功能(输入、输出、会话){

dtWithRadioButton您可以在
reactiveValues
中添加一个新变量来存储结果,使用
sapply
input
获取每个唯一
id
的数据,并将其存储在数据框中

library(shiny)
library(DT)
library(shinyWidgets)

my_table <- tibble(
  rowid = letters[1:7],
  val_1 = round(runif(7, 0, 10), 1),
  val_2 = round(rnorm(7), 2),
  Yes   = "Yes",
  No    = "No",
  Maybe = "Maybe"
) %>%
  mutate(
    Yes =  sprintf('<input type="radio" name="%s" value="%s"/>', rowid , Yes),
    No =  sprintf('<input type="radio" name="%s" value="%s"/>', rowid , No),
    Maybe =  sprintf('<input type="radio" name="%s" value="%s"/>', rowid , Maybe)
  )


shinyApp(
  ui = fluidPage(
    title = 'Radio buttons in a table',
    DT::dataTableOutput("datatable"),
    actionBttn(
      inputId = "btnProcess",
      label = "Process",
      style = "float",
      size = "sm",
      color = "success"
    ),
    actionBttn(
      inputId = "btnCancel",
      label = "Cancel",
      style = "float",
      size = "sm",
      color = "warning"
    ),
    dataTableOutput('result')
  ),
  
  server = function(input, output, session) {
    dtWithRadioButton <- reactiveValues(dt = my_table, result = NULL)
    
    
    output$datatable <- renderDT(
      datatable(
        dtWithRadioButton$dt,
        selection = "none",
        escape = FALSE,
        options = list(
          dom = 't',
          paging = FALSE,
          ordering = FALSE
        ),
        callback = JS(
          "table.rows().every(function(i, tab, row) {
                  var $this = $(this.node());
                  $this.attr('id', this.data()[0]);
                  $this.addClass('shiny-input-radiogroup');
                });
                Shiny.unbindAll(table.table().node());
                Shiny.bindAll(table.table().node());"
        ),
        rownames = F
      ),
      server = FALSE
    )
    
    
    observeEvent(input$btnProcess, {
      dt <- dtWithRadioButton$dt 
      dt$result <- sapply(unique(my_table$rowid), function(x) input[[x]])
      dtWithRadioButton$result <- dt
    })
    
    
    observeEvent(input$btnCancel, {
      removeModal(session)
    })
    
    output$result <- renderDT({
      req(dtWithRadioButton$result)
      datatable(dtWithRadioButton$result[c('rowid', 'val_1', 'val_2', 'result')])
    })
  }
)
库(闪亮)
图书馆(DT)
图书馆(shinyWidgets)
我的桌子%
变异(
是=sprintf(“”,rowid,是),
否=sprintf(“”,rowid,否),
Maybe=sprintf(“”,rowid,Maybe)
)
shinyApp(
ui=fluidPage(
标题='表中的单选按钮',
DT::dataTableOutput(“datatable”),
行动BTTN(
inputId=“btnProcess”,
label=“进程”,
style=“float”,
size=“sm”,
color=“成功”
),
行动BTTN(
inputId=“btnCancel”,
label=“取消”,
style=“float”,
size=“sm”,
color=“警告”
),
dataTableOutput('结果')
),
服务器=功能(输入、输出、会话){

dtWithRadioButton您可以在
无功
中进行计算,然后在
观测事件
中调用该
无功
,并使用您选择的任何输出方法将其显示为文本或DT表

library(shiny)
library(DT)
library(shinyWidgets)

my_table <- tibble(
  rowid = letters[1:7],
  val_1 = round(runif(7, 0, 10), 1),
  val_2 = round(rnorm(7), 2),
  Yes   = "Yes",
  No    = "No",
  Maybe = "Maybe"
) %>%
  mutate(
    Yes =  sprintf('<input type="radio" name="%s" value="%s"/>', rowid , Yes),
    No =  sprintf('<input type="radio" name="%s" value="%s"/>', rowid , No),
    Maybe =  sprintf('<input type="radio" name="%s" value="%s"/>', rowid , Maybe)
  )


shinyApp(
  ui = fluidPage(
    title = 'Radio buttons in a table',
    DT::dataTableOutput("datatable"),
    actionBttn(
      inputId = "btnProcess",
      label = "Process",
      style = "float",
      size = "sm",
      color = "success"
    ),
    actionBttn(
      inputId = "btnCancel",
      label = "Cancel",
      style = "float",
      size = "sm",
      color = "warning"
    ),
    verbatimTextOutput('sel')
    
    
    
  ),
  
  server = function(input, output, session) {
    dtWithRadioButton <- reactiveValues(dt = my_table)
    
    
    output$datatable <- renderDT(
      datatable(
        dtWithRadioButton$dt,
        selection = "none",
        escape = FALSE,
        options = list(
          dom = 't',
          paging = FALSE,
          ordering = FALSE
        ),
        callback = JS(
          "table.rows().every(function(i, tab, row) {
                  var $this = $(this.node());
                  $this.attr('id', this.data()[0]);
                  $this.addClass('shiny-input-radiogroup');
                });
                Shiny.unbindAll(table.table().node());
                Shiny.bindAll(table.table().node());"
        ),
        rownames = F
      ),
      server = FALSE
    )
    

    
    list_results <- reactive({
      list_values <- list()
      for (i in unique(my_table$rowid)) {
        list_values[[i]] <- paste0(i, ": ", input[[i]])
        
      }
      list_values
    })
    
    observeEvent(input$btnProcess, {
      
      output$sel = renderPrint({
        list_results()
      })


      
    })
    

    
    observeEvent(input$btnCancel, {
      removeModal(session)
    })
  }
)
库(闪亮)
图书馆(DT)
图书馆(shinyWidgets)
我的桌子%
变异(
是=sprintf(“”,rowid,是),
否=sprintf(“”,rowid,否),
Maybe=sprintf(“”,rowid,Maybe)
)
shinyApp(
ui=fluidPage(
标题='表中的单选按钮',
DT::dataTableOutput(“datatable”),
行动BTTN(
inputId=“btnProcess”,
label=“进程”,
style=“float”,
size=“sm”,
color=“成功”
),
行动BTTN(
inputId=“btnCancel”,
label=“取消”,
style=“float”,
size=“sm”,
color=“警告”
),
逐字输出('sel')
),
服务器=功能(输入、输出、会话){

dtWithRadioButton您可以在
无功
中进行计算,然后在
观测事件
中调用该
无功
,并使用您选择的任何输出方法将其显示为文本或DT表

library(shiny)
library(DT)
library(shinyWidgets)

my_table <- tibble(
  rowid = letters[1:7],
  val_1 = round(runif(7, 0, 10), 1),
  val_2 = round(rnorm(7), 2),
  Yes   = "Yes",
  No    = "No",
  Maybe = "Maybe"
) %>%
  mutate(
    Yes =  sprintf('<input type="radio" name="%s" value="%s"/>', rowid , Yes),
    No =  sprintf('<input type="radio" name="%s" value="%s"/>', rowid , No),
    Maybe =  sprintf('<input type="radio" name="%s" value="%s"/>', rowid , Maybe)
  )


shinyApp(
  ui = fluidPage(
    title = 'Radio buttons in a table',
    DT::dataTableOutput("datatable"),
    actionBttn(
      inputId = "btnProcess",
      label = "Process",
      style = "float",
      size = "sm",
      color = "success"
    ),
    actionBttn(
      inputId = "btnCancel",
      label = "Cancel",
      style = "float",
      size = "sm",
      color = "warning"
    ),
    verbatimTextOutput('sel')
    
    
    
  ),
  
  server = function(input, output, session) {
    dtWithRadioButton <- reactiveValues(dt = my_table)
    
    
    output$datatable <- renderDT(
      datatable(
        dtWithRadioButton$dt,
        selection = "none",
        escape = FALSE,
        options = list(
          dom = 't',
          paging = FALSE,
          ordering = FALSE
        ),
        callback = JS(
          "table.rows().every(function(i, tab, row) {
                  var $this = $(this.node());
                  $this.attr('id', this.data()[0]);
                  $this.addClass('shiny-input-radiogroup');
                });
                Shiny.unbindAll(table.table().node());
                Shiny.bindAll(table.table().node());"
        ),
        rownames = F
      ),
      server = FALSE
    )
    

    
    list_results <- reactive({
      list_values <- list()
      for (i in unique(my_table$rowid)) {
        list_values[[i]] <- paste0(i, ": ", input[[i]])
        
      }
      list_values
    })
    
    observeEvent(input$btnProcess, {
      
      output$sel = renderPrint({
        list_results()
      })


      
    })
    

    
    observeEvent(input$btnCancel, {
      removeModal(session)
    })
  }
)
库(闪亮)
图书馆(DT)
图书馆(shinyWidgets)
我的桌子%
变异(
是=sprintf(“”,rowid,是),
否=sprintf(“”,rowid,否),
Maybe=sprintf(“”,rowid,Maybe)
)
shinyApp(
ui=fluidPage(
标题='表中的单选按钮',
DT::dataTableOutput(“datatable”),
行动BTTN(
inputId=“btnProcess”,
label=“进程”,
style=“float”,
size=“sm”,
color=“成功”
),
行动BTTN(
inputId=“btnCancel”,
label=“取消”,
style=“float”,
size=“sm”,
color=“警告”
),
逐字输出('sel')
),
服务器=功能(输入、输出、会话){

dtWithRadioButton非常感谢。这确实是我正在寻找的,您如何将结果绑定到数据表的最后一列(填写结果)?您可以在
dtWithRadioButton$dt
中创建一个新列。更改
observeEvent(输入$btnproces
observeEvent(输入$btnProcess,{dtWithRadioButton$dt$result这实际上不起作用(它只工作一次,但不允许再次“单击”您可以检查更新的答案。我在原始数据表的下方创建了另一个datatable以显示结果。非常感谢。这确实是我正在寻找的,您如何将结果绑定到datatable的最后一列(填写结果)?您可以在
dtWithRadioButton$dt
中创建一个新列。将
observeEvent(输入$btnProcess
更改为
observeEvent(输入$btnProcess,{dtWithRadioButton$dt$result这实际上不起作用(它只起作用一次,但不允许再次“单击”您)