【问题标题】:Referencing HTML-Style Checkboxes in a RMarkdown / Shiny Document在 RMarkdown / Shiny 文档中引用 HTML 样式的复选框
【发布时间】:2014-12-15 21:52:16
【问题描述】:

我正在尝试使用 R Markdown 和 Shiny 创建一个交互式计算器。计算器将根据复选框是否被触发,从导入的表格中汇总汽车价格。我已经为计算器创建了一个基本的外壳,但我不知道如何引用复选框。

我希望我的复选框与我的表格一致,但无法使用 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 部分不起作用而崩溃。我得到的错误是:

错误:参数 1(类型“闭包”)不能由“猫”处理

(据我了解,renderText 将第一个参数传递给cat,它不知道如何处理该函数。)

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

【问题讨论】:

    标签: r shiny r-markdown


    【解决方案1】:

    只需进行一些更改,您就可以做到。引入一个反应变量来引用您的表值。 为您的复选框添加一个类并删除 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")
    ```
    

    【讨论】:

    • 太棒了,非常感谢!对于跟随的任何人,请确保在使用 jdharrison 的其余代码之前先导入数据并附加价格。此外,总和值将为空,并且会导致错误,直到选中任何复选框,但这将是一个简单的修复与一些错误处理逻辑。
    • 乐于助人。您可以直接从Shiny.onInputChange 返回总和,但将复选框向量用于其他计算可能很有用。
    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 2019-08-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    相关资源
    最近更新 更多