R 基于动态更改阈值条件创建新列
我正在尝试创建一个闪亮的应用程序,用户可以从下拉框中选择一个变量,例如toothgrowth数据集中的dose或supp,然后为变量中的每个唯一元素提供一个从1到100的滑块,例如,如果选择dose,则为0.5、1、2。根据选定的变量和滑块上的选定值,我想创建另一个二进制变量,例如,足够的长度,即:R 基于动态更改阈值条件创建新列,r,shiny,R,Shiny,我正在尝试创建一个闪亮的应用程序,用户可以从下拉框中选择一个变量,例如toothgrowth数据集中的dose或supp,然后为变量中的每个唯一元素提供一个从1到100的滑块,例如,如果选择dose,则为0.5、1、2。根据选定的变量和滑块上的选定值,我想创建另一个二进制变量,例如,足够的长度,即: if (input$group == "supp"){ ToothGrowth$sufficient_length[which(ToothGrowth$supp=="VC" &a
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
}
试试这个技巧,它(我认为)对级别的数量是健壮的
dat2`)
# [,1] [,2] [,3]
#[1,]错
#[2,]错
#[3,]错
#[4,]错
#[5,]错
#[6,]错
尾部(外部(牙齿生长[[input$group]],dat(),`==`)&
外部(ToothGrowth$len,mapply(`[`,list(input),dat(),FUN=`>`))
# [,1] [,2] [,3]
#[55]假假假真
#[56,]假假假真
#[57]假假假真
#[58,]假-假-真
#[59,]假假假真
#[60,]假假假真
(好吧,这里没什么意思,我只是想展示一下头部和尾部,以证明某些行是匹配的。)
apply
获取一个矩阵(两个矩阵的元素和,并将一个函数(any
)应用于每一行(1
,即应用函数的边距)##我的代码,现在分配到别处
ind`)&
外部(牙齿生长[[input$group]],dat(),`=`),
1(如有)
##你的代码
ToothGrowth$足够长[这(ToothGrowth$剂量=“0.5”和ToothGrowth$len>输入$“0.5”)]当然,这个例子可以压缩到+((选择的剂量和((剂量==1和len>1剂量和len>1剂量和len滑块值)|(剂量==2和len>2剂量和len滑块值))|(选择的剂量和滑块值)(supp==VC&&len>VC\u supp\u slider\u value))
(为转储道歉),但我不知道这是否有多大帮助。如果没有更多的上下文,就有点难以确定(如果有真正的代码就好了)。此外,扩展到更大的数据集是模糊的,是否意味着更多的行或不同的列/类别?顺便说一句:使用&
表明您正在处理值向量,而不是单例。使用&
的一个结果是它不会使用短路逻辑。如果您确实有值向量,则需要进行更全面的检查ples是进一步合理的。如果不是,那么,了解两者之间的区别可能会有帮助。对不起,我忘了包括闪亮应用程序的代码-我现在已经包括了它。我想避免的事情是显式地编码剂量和剂量==1
等,而是尝试将此编码更一般化选择r下拉选项,例如,dose
,supp
,…在更大的数据集中,每列将有不同的、更多的列和更多的类别。(1)您打算如何处理足够的长度
?在这种情况下,它似乎应该是nrow(ToothGrowth)
长的(因此您使用的&
是正确的)。(2)您说“如果剂量==1”,但用户无法选择该做什么。(3)最后,你能给出一组特定的用户选择下,足够长
应该是什么样子吗?我现在添加了更详细的代码和一个示例,说明如何在ggplot中使用足够长
。主要的是要找出是否有一种很好的方法来计算所有用户的足够长
没有硬编码的组合和我上面提到的else if语句。谢谢-这是一个很好的解决方案!
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)