if 语句在闪亮的反应函数中不可解释为逻辑

if statement is not interpretable as logical in Shiny reactive function

我目前正在做一个 R Shiny 项目,下面是我在实际项目中试图完成的事情的一个小代表。基本思想是处理通过 eventReactive 函数中的条件语句从用户输入生成的反应数据表。在下面的示例中,我想使用条件“if”语句对用户输入进行加法、乘法或减法。我收到此错误:“if 中的错误:参数不可解释为合乎逻辑的”。我知道我没有为此处的逻辑比较正确地子设置 col1,而且似乎找不到解决方案。

library(shiny)
library(DT)
library(tidyverse)


input_data <- data.frame(input1 = character(),
                         input2 = double(),
                         stringsAsFactors = FALSE)

ui <- fluidPage(
  
  titlePanel("Title"),
  
  sidebarLayout(
    sidebarPanel(
      selectInput("input1",
                  "Input 1",
                  choices = c("Add", "Multiply", "Subtract")),
      numericInput("input2",
                   "Input 2",
                   value = 100),
      actionButton("add_btn",
                   "Add Input"),
      actionButton("process_btn", 
                   "Process Input"),
      position = "left"
    ),
    
    mainPanel(
      DT::dataTableOutput("input_table"),
      DT::dataTableOutput("output_table")
    )
  )
)

server <- function(input, output) {
  input_table <- reactiveVal(input_data)
  observeEvent(input$add_btn, {
    t = rbind(input_table(), data.frame(col1 = input$input1, col2 = input$input2))
    input_table(t)
  })
  
  output$input_table <- DT::renderDataTable({
    datatable(input_table())
  })
  
  output_table <- eventReactive(input$process_btn, {
    input_table() %>%
      if(input_table()$col1 == "Add") {
        mutate(col3 = col2 + 50)
      } else if(input_table()$col1 == "Multiply") {
        mutate(col3 = col2 * 50)
      } else 
        mutate(col3 = col2 - 50)
  })
  output$output_table <- DT::renderDataTable({
    datatable(output_table())
  })
}

您不能使用if构建宪法管道%>%(特别是取决于管道对象的内容)。

您可以改用 ifelse(),或者更好:if_else()`:

input_table() %>%
  mutate(col3 = 
    if_else(col1 == "Add",
           col2 + 50,
           if_else(col1 == "Multiply",
                  col2 * 50,
                  col2 - 50)
  )

如果你有几个条件,你也可以使用 case_when():

input_table() %>%
  mutate(col3 = 
           case_when(
             col1 == "Add" ~ col2 + 50,
             col1 == "Multiply" ~ col2 * 50,
             TRUE ~ col2 - 50)
         )