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