我目前正在一个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)
)