如何将在 renderUI 中创建的输入用于 R Shiny 中的反应函数?
How to use an input created in renderUI into a reactive function in R Shiny?
我在 UI 中创建了两个输入:“slider0”和“slider1”,在服务器中使用 renderUI“slider2”创建了一个。
我正在尝试根据 slider0 的条件语句以及 slider1 和 slider2 的值来计算数据框的新列。
我有以下可重现的代码:
library(shiny)
library(DT)
library(dplyr)
library(shinydashboard)
library(htmltools)
library(shinyjs)
first_column <- c("15", "25")
second_column <- c("0.5", "50")
d0 <- data.frame(first_column, second_column)
d0[,1:2 ] <- sapply(d0[ ,1:2],as.numeric)
######################### header ##########
header <- dashboardHeader(
title = "TEST")
################ Sidebar ################
sidebar <- dashboardSidebar(
sidebarMenu(
menuItem("Test", tabName = "Test"),
menuItem("Test2", tabName = "Test2")
)
)
######################### body ##################
body <- dashboardBody(
tabItems(
tabItem(tabName = "Test",
fluidRow(
column(width = 4,
box(width = NULL, solidHeader = TRUE,
useShinyjs(),
radioButtons(
inputId="slider0",
label="slider0",
choices = c("Yes"="Yes", "No"="No"), inline=TRUE),
column(4,numericInput("slider1", "slider1", min = 0, max = 1, value = 0.25, step=0.05)),
column(4, uiOutput("slider2"))
)),
column(width = 8,
box(width = NULL, solidHeader = TRUE,
DT::dataTableOutput(outputId = "mytable")
))
))))
################# ui #############
ui<- dashboardPage(
header,
sidebar,
body
)
################server ###############
server <- function(input, output) {
output$slider2 <- renderUI({
req(input$slider1)
numericInput("slider2", "slider2", min = 0, max = 1 , value = 1- input$slider1, step=0.05)
})
############ This code does not have warning error when input$slide1 is used in mutate ##########
d1<-reactive({
if(input$slider0 == "Yes"){
d0 %>%
mutate(C3= first_column*input$slider2)
} else {d0 }
})
output$mytable = renderDataTable({
d1()
})
}
#####
shinyApp(ui=ui, server=server)
在服务器中,我想通过将数据框的一列与在服务器中使用 renderUI 定义的 input$slider2 相乘来计算新列 C3。
我收到以下错误消息:
“警告:错误:mutate()
输入 C3
有问题。
x 输入 C3
无法回收到大小 2。
ℹ 输入 C3
是 first_column * input$slider2
。
ℹ 输入 C3
必须是大小 2 或 1,而不是 0。
138:“
当我选择 UI 中定义的 input$slider1 时,我没有收到任何 error/warnings 消息,但我不知道问题出在哪里。
在进一步使用之前,您可以req
确定 input$server2
已定义且具有有效值:
d1 <- reactive({
if(input$slider0 == "Yes"){
# Make sure that input$slider2 is ready to be used
req(input$slider2)
# Will be executed as soon as above requirement is fulfilled
d0 %>%
mutate(C3= first_column*input$slider2)
} else {d0 }
})
我在 UI 中创建了两个输入:“slider0”和“slider1”,在服务器中使用 renderUI“slider2”创建了一个。 我正在尝试根据 slider0 的条件语句以及 slider1 和 slider2 的值来计算数据框的新列。
我有以下可重现的代码:
library(shiny)
library(DT)
library(dplyr)
library(shinydashboard)
library(htmltools)
library(shinyjs)
first_column <- c("15", "25")
second_column <- c("0.5", "50")
d0 <- data.frame(first_column, second_column)
d0[,1:2 ] <- sapply(d0[ ,1:2],as.numeric)
######################### header ##########
header <- dashboardHeader(
title = "TEST")
################ Sidebar ################
sidebar <- dashboardSidebar(
sidebarMenu(
menuItem("Test", tabName = "Test"),
menuItem("Test2", tabName = "Test2")
)
)
######################### body ##################
body <- dashboardBody(
tabItems(
tabItem(tabName = "Test",
fluidRow(
column(width = 4,
box(width = NULL, solidHeader = TRUE,
useShinyjs(),
radioButtons(
inputId="slider0",
label="slider0",
choices = c("Yes"="Yes", "No"="No"), inline=TRUE),
column(4,numericInput("slider1", "slider1", min = 0, max = 1, value = 0.25, step=0.05)),
column(4, uiOutput("slider2"))
)),
column(width = 8,
box(width = NULL, solidHeader = TRUE,
DT::dataTableOutput(outputId = "mytable")
))
))))
################# ui #############
ui<- dashboardPage(
header,
sidebar,
body
)
################server ###############
server <- function(input, output) {
output$slider2 <- renderUI({
req(input$slider1)
numericInput("slider2", "slider2", min = 0, max = 1 , value = 1- input$slider1, step=0.05)
})
############ This code does not have warning error when input$slide1 is used in mutate ##########
d1<-reactive({
if(input$slider0 == "Yes"){
d0 %>%
mutate(C3= first_column*input$slider2)
} else {d0 }
})
output$mytable = renderDataTable({
d1()
})
}
#####
shinyApp(ui=ui, server=server)
在服务器中,我想通过将数据框的一列与在服务器中使用 renderUI 定义的 input$slider2 相乘来计算新列 C3。
我收到以下错误消息:
“警告:错误:mutate()
输入 C3
有问题。
x 输入 C3
无法回收到大小 2。
ℹ 输入 C3
是 first_column * input$slider2
。
ℹ 输入 C3
必须是大小 2 或 1,而不是 0。
138:“
当我选择 UI 中定义的 input$slider1 时,我没有收到任何 error/warnings 消息,但我不知道问题出在哪里。
在进一步使用之前,您可以req
确定 input$server2
已定义且具有有效值:
d1 <- reactive({
if(input$slider0 == "Yes"){
# Make sure that input$slider2 is ready to be used
req(input$slider2)
# Will be executed as soon as above requirement is fulfilled
d0 %>%
mutate(C3= first_column*input$slider2)
} else {d0 }
})