【发布时间】:2015-04-23 15:22:36
【问题描述】:
目标是构建一个应用程序,该应用程序能够仅选择和呈现满足用户通过 Shiny 元素(例如 checkboxes 和 sliderInput)选择的特定条件的矩阵行
我们的data 有两种(或更多)方式被过滤:
- 通过
checkboxGroupInput,用户可以选择一个或多个号码 - 通过
sliders。data的每一列都有一个滑块。这允许用户选择每列的数字范围。
我一直坚持让data 对用户输入的选择做出反应。任何建议表示赞赏!
这是我的代码:
服务器.R
# Load libraries.
library(shiny)
library(datasets)
library(xtable)
library(R.utils)
shinyServer(
function(input, output) {
source('global.R', local=TRUE)
getDataName <- reactive({
out <- input$dataName
print(out)
return(out)
})
getData <- reactive({
cat("Getting data for, ", getDataName(), ".", sep = '')
if(getDataName() == ""){
print("ERROR: getDAtaName is empty! Check your code!")
out <- NULL
}
else {
dataSet <- t(combn(max(selectRange(getDataName())), numCols(getDataName())))
}
print(head(dataSet, n = 10))
return(dataSet)
})
selectedValues <- reactive({
print("Numbers selected via checkboxes:")
print(input$numSelector)
})
output$numSelector <- renderUI({
out <- checkboxGroupInput(
inputId = "numSelector",
label = "Select the numbers to be included in the rows",
choices = selectRange(input$dataName),
inline = TRUE
)
return(out)
})
output$sliders <- renderUI({
numSliders <- numCols(input$dataName)
lapply(1:numSliders, function(i) {
sliderInput(
inputId = paste0('column', i),
label = paste0('Select the range for column ', i),
min = min(selectRange(input$dataName)),
max = max(selectRange(input$dataName)),
value = c(min(selectRange(input$dataName)), max(selectRange(input$dataName))),
step =1)
})
})
output$selectedDataDisplay <- renderDataTable({
as.table(getData())}, options = list(lengthMenu = c(5, 30, 50), pageLength = 10))
}
)
ui.R
library(shiny)
shinyUI(
pageWithSidebar(
headerPanel("Selection zone"),
# Select inputs
sidebarPanel(
selectInput(
inputId = "dataName",
label = "Select data",
choices = c("data1", "data2", "data3", "data4")
),
uiOutput(outputId = "numSelector"),
uiOutput(outputId = "sliders")
),
mainPanel(
tableOutput("selectedDataDisplay"))
)
)
global.R
selectRange <- function(x){
if(x == "data1"){choices = c(1:10)}
if(x == "data2"){choices = c(1:15)}
if(x == "data3"){choices = c(1:20)}
if(x == "data4"){choices = c(1:25)}
return(choices)
}
numCols <- function(x){
if(x == "data1"){maxNum = 10
numCol = 5}
if(x == "data2"){maxNum = 15
numCol = 5}
if(x == "data3"){maxNum = 20
numCol = 5}
if(x == "data4"){maxNum = 25
numCol = 6}
return(numCol)
}
【问题讨论】:
-
你能认出
selectRange吗?它是用户定义的函数还是来自包? -
我认为最好发布一个可重现的示例
-
我编辑了这个问题。基本上,
data可以不同。相反,20 它可能是 40 或其他东西。我在global.R中定义了所有这些,它们的来源是根据用户选择的数据名称。 -
这个问题引起了我的兴趣,因为物流,但它对我来说不再有意义,也许我不理解这一点:如果你为不同的列指定不同的范围,你想要所有满足至少一个条件的行还是只满足所有条件的行?
-
@mkemp6:我发布了这个问题所需的所有文件。问题已被编辑为与添加的代码同步。由于某种原因,我无法显示表格,不想让您等到我修复它。