我尝试使用R Markdown和Shiny创建交互式计算器。计算器将根据是否触发复选框,从导入的表中汇总汽车价格。我已经为计算器创建了一个基本shell,但我不知道如何引用复选框。
我希望我的复选框与我的表格一致,并且无法使用checkBoxGroupInput来执行此操作。但是,我确实找到了this recent SO thread,这表明我可以使用cbind来组合(看起来像是)带有数据表的复选框的HTML向量:
---
output: html_document
runtime: shiny
---
### Select car(s)
```{r, echo=FALSE}
## import car data
data <- head(mtcars[1:6])
data$id <- seq(1:nrow(data))
## generate random car prices
set.seed(1)
data$price <- round(runif(nrow(data),5000,15000),0)
## create table w/ checkboxes
output$mytable = renderDataTable({
addCheckboxButtons <- paste0('<input id="table1" type="checkbox" name="row', data$id, '" value="op', data$id, '">',"")
#Display table with checkbox buttons
z <- cbind(Pick=addCheckboxButtons, data)
z
})
## display table
dataTableOutput({"mytable"})
```
上面的代码工作正常并生成我想要的表。然而,我陷入困境,因为我不确定如何引用我的复选框向量。我知道我需要使用被动语句来进行求和,但我不确定如何引用复选框来执行此操作。我想最后一段代码看起来像是:
### Total bill
```{r, echo=FALSE}
my_sum <- reactive({z$price[z$Pick=="TRUE"]})
renderText(my_sum)
```
由于data$Pick
部分不起作用,代码会爆炸。我得到的错误是:
错误:&#39; cat&#39;
无法处理参数1(类型&#39;封闭&#39;)
(据我所知,renderText将第一个参数传递给cat
,它不知道如何处理该函数。)
有人可以帮我参考我创建的复选框吗?
答案 0 :(得分:3)
只需进行一些更改即可。引入一个反应变量来引用您的表值。 在复选框中添加一个类并删除id。
## make reactive variable
myZ <- reactive({
addCheckboxButtons <- paste0('<input class = "mycheckbox" type="checkbox" name="row', data$id, '" value="op', data$id, '">',"")
#Display table with checkbox buttons
z <- cbind(Pick=addCheckboxButtons, data)
z
})
为您的表添加回调。单击一行时,将检查复选框状态并以字符串形式返回。
## create table w/ checkboxes
output$mytable = renderDataTable({
myZ()
},
callback = "function(table) {
table.on('click.dt', 'tr', function() {
Shiny.onInputChange('rows',$('.mycheckbox').map(function(){return this.checked*1;}).get().join(\",\"))
});
}")
## display table
dataTableOutput({"mytable"})
```
操纵返回的0,1的字符串,指示是否选中了框并使用它从表中进行选择。
### Total bill
```{r, echo=FALSE}
my_sum <- reactive({
myZ()$price[myZ()$Pick=="TRUE"]
})
output$mytext <- renderText({idx <-strsplit(input$rows, ",")[[1]] == "1"
sum(myZ()$price[idx])
}
)
textOutput("mytext")
```