if statement is not interpretable as logical in Shiny reactive function

I am currently working on an R Shiny project and below is a small reprex of the things I am trying to accomplish in my actual project. The basic idea is to process reactive data tables that are generated from user inputs through conditional statements in eventReactive functions. In this example below, I want to either add, multiply or subtract the user input using conditional "if" statements. I get this error: "Error in if: argument is not interpretable as logical". I know I am not sub-setting col1 correctly for logical comparison here and can't seem to find a solution.

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())
  })
}

1 answer

  • answered 2022-05-07 00:48 HubertL

    You can not use if to build constitutional pipe %>% (especially depending on the content of the piped object).

    You can use ifelse() instead, or better : if_else()`:

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

    As you have several conditions you also can use case_when():

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

How many English words
do you know?
Test your English vocabulary size, and measure
how many words do you know
Online Test
Powered by Examplum