在RMarkdown / Shiny文档中引用HTML样式的复选框

时间:2014-12-15 21:52:17

标签: r shiny r-markdown

我尝试使用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,它不知道如何处理该函数。)

有人可以帮我参考我创建的复选框吗?

1 个答案:

答案 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")
```