【问题标题】:Lookup of value's location in a table of minimum and maximum ranges在最小和最大范围表中查找值的位置
【发布时间】:2017-07-27 14:41:03
【问题描述】:

我在 R 中有一个数据框,用于闪亮的应用程序。这个数据框有一列最小值,一列最大值。然后得到作为返回结果的列。它看起来像这样:

Min Max Return ReturnifConditionTrue
71    80      40         30
81    90      45         35
91    100    50         40

将通过用户输入接收数字。一旦给出了一个数字,就必须找到它所在的范围。一旦找到其对应的范围,则必须从该范围所在的同一行返回另一列的另一个金额。如果某个条件为真,则必须返回另一列的结果。例如,如果用户给出 85 作为值,但条件测试为假,则函数应返回 45 作为结果。

我无法找到解决方案。我已经将ifbetween 和增量for 循环结合使用,但这不起作用(测试条件,然后找到between 函数返回true 的位置,然后匹配列并返回值) ,我怀疑即使它确实有效,实现起来也会很慢,因为这个功能将被集成到闪亮应用程序的服务器端。有没有一种方法可以实现这一点并且可能更有效?提前致谢。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    您正在寻找的是函数which()。它返回满足特定条件的位置。然后,您可以使用 if 语句来选择要从中获取值的列。

    tb = data.frame(
      Min = c(71, 81, 91),
      Max = c(80, 90, 100),
      Return = c(40, 45, 50),
      ReturnifConditionTrue = c(30, 35, 40)
    )
    
    x = 75
    condition = TRUE
    
    pos = which(x >= tb$Min & x <= tb$Max)
    
    if (condition) {
      val = tb$ReturnifConditionTrue[pos]
    } else {
      val = tb$Return[pos]
    }
    

    【讨论】:

    • 感谢您的回答-效果很好。我正在尝试将 if 语句和 pos 计算放入命名函数中,以便我可以将它们移动到另一个 R 文件中并稍后调用它们。我不断收到涉及“关闭”到“字符”转换的错误。 as.function 也没有用。你有什么建议吗?
    【解决方案2】:

    你可以这样做:

    df <- read.table(text="Min Max Return ReturnifConditionTrue
    71    80      40         30
    81    90      45         35
    91    100    50         40",header=T)
    
    library(shiny)
    
    ui <- shinyUI(
      fluidPage(
    numericInput("number","Number: ",min=71,max=100,value=85,step=1),
    selectInput("condition","Condition:", choices=c("TRUE","FALSE")),
    textOutput("text")
    )
    )
    
    server <- function(input, output, session) {
    
      my_result <- reactive({
         our_row <- which(input$number>=df$Min & input$number<=df$Max)
         if(input$condition=="TRUE")
         {
           return(df[our_row,"ReturnifConditionTrue"])
         }
         else
         {
           return(df[our_row,"Return"])
         }
    
      })
    
      output$text <- renderText({my_result() })
    
    }
    
    shinyApp(ui,server)
    

    虽然您可能会考虑将数据框更改为:

    df <- read.table(text="Min Max Return ReturnifConditionTrue
    71    80      40         30
    80    90      45         35
    90    100    50         40",header=T)
    

    然后将条件更改为

         our_row <- which(input$number>df$Min & input$number<=df$Max)
    

    所以它也适用于连续数字。

    我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2015-09-29
      • 2016-08-31
      • 2019-02-11
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多