Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于动态更改阈值条件创建新列_R_Shiny - Fatal编程技术网

R 基于动态更改阈值条件创建新列

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

我正在尝试创建一个闪亮的应用程序,用户可以从下拉框中选择一个变量,例如toothgrowth数据集中的dose或supp,然后为变量中的每个唯一元素提供一个从1到100的滑块,例如,如果选择dose,则为0.5、1、2。根据选定的变量和滑块上的选定值,我想创建另一个二进制变量,例如,足够的长度,即:

    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)