在最小和最大范围的表中查找值的位置

时间:2017-07-27 14:41:03

标签: r shiny

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

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

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

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

2 个答案:

答案 0 :(得分: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]
}

答案 1 :(得分:0)

你可以这样做:

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)

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

我希望这有帮助!