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