使用renderUI更新数据集而不是条件面板
我正在编写一个闪亮的应用程序来实现以下效果: 每当我选择categoryname包含的变量时,web将生成提供分隔符的滑块。它将所选变量分为两组,并形成一个新列,其中包含添加到原始数据集中的组名 这里的人在中使用条件面板帮助我解决了这个问题,但现在我使用renderUI和shinyjs,因为条件面板在我的大型项目中不起作用 我被一个小虫子卡住了(似乎): 下面是我的代码,如何更改它以使函数工作使用renderUI更新数据集而不是条件面板,r,shiny,shinyjs,R,Shiny,Shinyjs,我正在编写一个闪亮的应用程序来实现以下效果: 每当我选择categoryname包含的变量时,web将生成提供分隔符的滑块。它将所选变量分为两组,并形成一个新列,其中包含添加到原始数据集中的组名 这里的人在中使用条件面板帮助我解决了这个问题,但现在我使用renderUI和shinyjs,因为条件面板在我的大型项目中不起作用 我被一个小虫子卡住了(似乎): 下面是我的代码,如何更改它以使函数工作 library(shiny) library(shinyjs) library(stringr) c
library(shiny)
library(shinyjs)
library(stringr)
categoryname = c("mpg_group", "disp_group")
MT_EG = mtcars[,1:5]
# Define UI for application that draws a histogram
ui <- fluidPage(
useShinyjs(),
# Application title
titlePanel("Mtcars Data"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
selectInput(inputId = "arm",
label = "ARM VARIABLE",
choices = c("mpg_group", "cyl", "disp_group", "hp", "drat"),
selected = "cyl"),
# conditionalPanel(
# #condition = "categoryname.includes(input.arm)",
# condition = "input.arm == 'disp_group' | input.arm == 'mpg_group'",
#
# #sliderInput("divider", "divide slider", 1, 100, 20)
# optionalSliderInputValMinMax("divider", "divide slider", c(50,0,100), ticks = FALSE)
# )
uiOutput("divider")
),
# Show a plot of the generated distribution
mainPanel(
uiOutput("data")
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output, session) {
output$divider <- renderUI({
if (input$arm %in% categoryname){
show("divider")
}
else{
hide("divider")
}
sliderInput("divider", "divide slider", 0, 100, 50)
})
observeEvent(
input$arm,
observe(
{
if (input$arm %in% categoryname){
#browser()
# start over and remove the former column if exists
MT_EG = MT_EG[, !(colnames(MT_EG) %in% input$arm)]
id_arm_var <- input$arm
id_arm <- unlist(str_split(id_arm_var,'_'))[1]
# change the range of the slider
val <- input$divider
mx = max(MT_EG[[id_arm]])
mn = min(MT_EG[[id_arm]])
updateSliderInput(session, inputId = "divider", min=floor(mn/2),max = mx + 4,step = 1,value = input$divider)
# generate a new column and bind
divi <- data.frame(id_arm_var = MT_EG[[id_arm]]>input$divider)
divi$id_arm_var[divi$id_arm_var==TRUE] <- paste0(id_arm_var, " Larger")
divi$id_arm_var[divi$id_arm_var==FALSE] <- paste0(id_arm_var, " Smaller")
colnames(divi) <- id_arm_var
MT_EG <- cbind(MT_EG,divi)
}
output$data=renderTable(MT_EG)
}
)
)
}
# Run the application
shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(shinyjs)
图书馆(stringr)
categoryname=c(“mpg组”、“disp组”)
MT_EG=mtcars[1:5]
#为绘制直方图的应用程序定义UI
uiobserveEvent
和renderUI
都依赖于“或由”输入$arm
触发。所发生的事情是observeEvent
在renderUI
呈现之前请求input$divider
,并且input$divider
可用于observeEvent
,正如我前面提到的input$divider
的值为空
要解决此问题,只需在MT_EG=MT_EG[,!(colnames(MT_EG)%in%input$arm)]之前添加req(input$divider)
。同时将output$divider
更改为output$dividerUI
,因为Shining不允许使用相同的id进行输入和输出
有关更多详细信息,请参见?shinny::req
。我不知道为什么,但输入$divider
的结果是值为NULL,这会导致cbind(MT_例如,divi)
因上述错误而失败。一个对我有效的解决方案是将sliderInput(“分隔器”、“分割滑块”、0、100、50)
移动到UI,并使用观察({toggle(id=“divider”,condition=input$arm%in%categoryname)})
删除renderUI
和uiOutput(“分隔器”)
。我也不认为观察是正确的necessary@A.Suliman真管用!非常感谢你!(请注意:必须遵守
,否则添加列中的分隔符结果不能随滑块更改。)
library(shiny)
library(shinyjs)
library(stringr)
categoryname = c("mpg_group", "disp_group")
MT_EG = mtcars[,1:5]
# Define UI for application that draws a histogram
ui <- fluidPage(
useShinyjs(),
# Application title
titlePanel("Mtcars Data"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
selectInput(inputId = "arm",
label = "ARM VARIABLE",
choices = c("mpg_group", "cyl", "disp_group", "hp", "drat"),
selected = "cyl"),
# conditionalPanel(
# #condition = "categoryname.includes(input.arm)",
# condition = "input.arm == 'disp_group' | input.arm == 'mpg_group'",
#
# #sliderInput("divider", "divide slider", 1, 100, 20)
# optionalSliderInputValMinMax("divider", "divide slider", c(50,0,100), ticks = FALSE)
# )
uiOutput("divider")
),
# Show a plot of the generated distribution
mainPanel(
uiOutput("data")
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output, session) {
output$divider <- renderUI({
if (input$arm %in% categoryname){
show("divider")
}
else{
hide("divider")
}
sliderInput("divider", "divide slider", 0, 100, 50)
})
observeEvent(
input$arm,
observe(
{
if (input$arm %in% categoryname){
#browser()
# start over and remove the former column if exists
MT_EG = MT_EG[, !(colnames(MT_EG) %in% input$arm)]
id_arm_var <- input$arm
id_arm <- unlist(str_split(id_arm_var,'_'))[1]
# change the range of the slider
val <- input$divider
mx = max(MT_EG[[id_arm]])
mn = min(MT_EG[[id_arm]])
updateSliderInput(session, inputId = "divider", min=floor(mn/2),max = mx + 4,step = 1,value = input$divider)
# generate a new column and bind
divi <- data.frame(id_arm_var = MT_EG[[id_arm]]>input$divider)
divi$id_arm_var[divi$id_arm_var==TRUE] <- paste0(id_arm_var, " Larger")
divi$id_arm_var[divi$id_arm_var==FALSE] <- paste0(id_arm_var, " Smaller")
colnames(divi) <- id_arm_var
MT_EG <- cbind(MT_EG,divi)
}
output$data=renderTable(MT_EG)
}
)
)
}
# Run the application
shinyApp(ui = ui, server = server)