【发布时间】:2020-01-16 12:35:10
【问题描述】:
我正在尝试创建一个闪亮的应用程序,用户从下拉框中选择一个变量,例如牙生长数据集中的剂量或补充,则变量中每个唯一元素的滑块从 1 到 100 可用,例如,如果选择剂量,则为 0.5、1、2。根据滑块上的变量 selected 和 selected 值,我想创建另一个二进制变量,例如足够的长度,即:
if (input$group == "supp"){
ToothGrowth$sufficient_length[which(ToothGrowth$supp=="VC" & ToothGrowth$len > input$VC)]<-1
ToothGrowth$sufficient_length[which(ToothGrowth$supp=="VC" & ToothGrowth$len <= input$VC)]<-0
ToothGrowth$sufficient_length[which(ToothGrowth$supp=="OJ" & ToothGrowth$len > input$OJ)]<-1
ToothGrowth$sufficient_length[which(ToothGrowth$supp=="OJ" & ToothGrowth$len <= input$OJ)]<-0
} else if (input$group == "dose"){
ToothGrowth$sufficient_length[which(ToothGrowth$dose=="0.5" & ToothGrowth$len > input$"0.5")]<-1
ToothGrowth$sufficient_length[which(ToothGrowth$dose=="0.5" & ToothGrowth$len <= input$"0.5")]<-0
ToothGrowth$sufficient_length[which(ToothGrowth$dose=="1" & ToothGrowth$len > input$"1")]<-1
ToothGrowth$sufficient_length[which(ToothGrowth$dose=="1" & ToothGrowth$len <= input$"1")]<-0
ToothGrowth$sufficient_length[which(ToothGrowth$dose=="2" & ToothGrowth$len > input$"2")]<-1
ToothGrowth$sufficient_length[which(ToothGrowth$dose=="2" & ToothGrowth$len <= input$"2")]<-0
}
有没有一种方法可以做到这一点,而无需对所有可能性进行硬编码,因为一旦我开始工作,我会将其应用于比 toothgroup 更大的数据集,其中有许多变量和这些变量中的更多独特元素?
到目前为止,shinny 应用的完整代码是:
library(shiny)
library(ggplot2)
data("ToothGrowth")
ui<-shinyUI(
fluidPage(
fluidRow(
column(width = 4,
selectInput("group", "Group:",
c("Supp" = "supp",
"Dose" = "dose")),
uiOutput("sliders"),
tableOutput("summary")
),
mainPanel(
# Output: Histogram ----
plotOutput(outputId = "distPlot")
)
)
)
)
server <- shinyServer( function(input, output) {
dat<-reactive({
as.character(unique(ToothGrowth[,input$group]))
})
#reactive code for referrals based on the slider for threshold----
dat2 <- reactive({
req(ToothGrowth)
ToothGrowth$sufficient_length<-rep(0,nrow(ToothGrowth))
if (input$group == "supp"){
ToothGrowth$sufficient_length[which(ToothGrowth$supp=="VC" & ToothGrowth$len > input$VC)]<-1
ToothGrowth$sufficient_length[which(ToothGrowth$supp=="VC" & ToothGrowth$len <= input$VC)]<-0
ToothGrowth$sufficient_length[which(ToothGrowth$supp=="OJ" & ToothGrowth$len > input$OJ)]<-1
ToothGrowth$sufficient_length[which(ToothGrowth$supp=="OJ" & ToothGrowth$len <= input$OJ)]<-0
} else if (input$group == "dose"){
ToothGrowth$sufficient_length[which(ToothGrowth$dose=="0.5" & ToothGrowth$len > input$"0.5")]<-1
ToothGrowth$sufficient_length[which(ToothGrowth$dose=="0.5" & ToothGrowth$len <= input$"0.5")]<-0
ToothGrowth$sufficient_length[which(ToothGrowth$dose=="1" & ToothGrowth$len > input$"1")]<-1
ToothGrowth$sufficient_length[which(ToothGrowth$dose=="1" & ToothGrowth$len <= input$"1")]<-0
ToothGrowth$sufficient_length[which(ToothGrowth$dose=="2" & ToothGrowth$len > input$"2")]<-1
ToothGrowth$sufficient_length[which(ToothGrowth$dose=="2" & ToothGrowth$len <= input$"2")]<-0
}
return(ToothGrowth)
})
#Render the sliders
output$sliders <- renderUI({
# First, create a list of sliders each with a different name
sliders <- lapply(1:length(dat()), function(i) {
inputName <- dat()[i]
sliderInput(inputName, inputName, min=0, max=100, value=10)
})
# Create a tagList of sliders (this is important)
do.call(tagList, sliders)
})
output$distPlot <- renderPlot({
ggplot(dat2(),aes(len,fill = as.factor(sufficient_length)))+
geom_histogram(bins=20)
})
})
shinyApp(ui, server)
【问题讨论】:
-
当然,这个例子可以压缩到
+((dose_selected && ((dose == 1 && len > 1_dose_slider_value) || (dose == 2 && len > 2_dose_slider_value))) || (supp_selected && ((supp == OJ && len > OJ_supp_slider_value) || (supp == VC && len > VC_supp_slider_value))))(为转储道歉),但我不知道这是否有多大帮助。如果没有更多的上下文就很难确定(如果有真正的代码会很好)。此外,扩展到更大的数据集是模糊的,是否意味着更多的行或不同的列/类别? -
顺便说一句:使用
&表明您正在处理值向量,而不是单例。使用&的一个后果是它不会使用短路逻辑。如果你确实有一个值向量,那么更完整的例子是更合理的。如果不是,那么,了解&and&&之间的区别也许会有所帮助。 -
抱歉,迄今为止我忘记包含闪亮应用程序的代码 - 我现在已经包含它。我想避免的事情是显式编码
dose和dose==1等,而是尝试使这种编码更通用于选择的下拉选项,例如dose,supp,... 在更大的数据集中会有不同的、更多的列和每列更多的类别。 -
(1) 你打算用
sufficient_length做什么?在这种情况下,它似乎应该是nrow(ToothGrowth)长(所以你使用&是正确的)。 (2) 你说"if dose == 1",但是用户没有办法选择做什么。 (3) 最后,您能否在给定一组特定用户选择的情况下包含sufficient_length的外观? -
我现在添加了更详细的代码和如何在 ggplot 中使用
sufficient_length的示例。主要是找出是否有一种很好的方法来计算所有组合的sufficient_length,而无需使用上面的 else if 语句进行硬编码。