我正在尝试让用户指定变量中断作为要提供给cut
函数的输入
对于固定的中断,以下代码通过接受一个数字输入并将该列切成指定宽度的块来工作。但是,我希望此变量是可变的,以便可以选择任意数量的中断。下面是我的闪亮代码。
ui <- fluidPage(
numericInput("breaks", "Breaks:", 5, min = 1, max = 100),
dataTableOutput("data")
)
server <- function(input, output) {
data <- reactive({
data <- data.frame(A = seq(1:100))
data$Result <- cut(data$A, breaks = c(0, 5, 8, 15, 100))
data$Result2 <- cut(data$A, breaks = seq(0, 100, by = input$breaks))
data
})
output$data <- renderDataTable(data())
}
shinyApp(ui, server)
哪种方法是让用户输入变量中断(例如,在我的代码示例中为0、5、8、15、100)并将其提供给cut函数以获得类似于我的Result列的新列的最简单方法?
答案 0 :(得分:1)
这完全取决于您的创造力和解决问题的纯粹问题。从字面上看,有数百种方法可以解决该问题。
以下是一种解决方案,可让您插入逗号分隔的值以定义中断。
但是您也可以考虑创建动态数量的数字输入。
library(shiny)
ui <- fluidPage(
textInput("breaks", "Breaks", placeholder = "Enter values separated by a comma..."),
textOutput("breakresult"),
dataTableOutput("data")
)
server <- function(input, output) {
data <- reactive({
nums <- extract(input$breaks)
data <- data.frame(A = seq(1:100))
data$Result <- cut(data$A, breaks = c(0, 5, 8, 15, 100))
if (!anyNA(nums) && length(nums) >= 2) {
data$Result2 <- cut(data$A, breaks = nums)
}
data
})
extract <- function(text) {
text <- gsub(" ", "", text)
split <- strsplit(text, ",", fixed = FALSE)[[1]]
as.numeric(split)
}
output$breakresult <- renderText({
nums <- extract(input$breaks)
if (anyNA(nums)) {
"Invalid input"
} else {
paste(c("Breaks:", paste(nums, collapse = ", ")), collapse = " ")
}
})
output$data <- renderDataTable(data())
}
shinyApp(ui, server)