2017-07-27 23 views
1

光沢のあるアプリで使用するためにRにデータフレームがあります。このデータフレームには、最小値の列と最大値の列があります。その後、返品結果の列が表示されます。最小範囲と最大範囲のテーブル内の値の場所の検索

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

数字はユーザー入力から受け取ります。数字が与えられたら、それが入る範囲を見つけなければなりません。対応する範囲が見つかると、範囲と同じ行から別の列の別の量を戻す必要があります。ある条件が真であれば、別の列の結果を戻す必要があります。例えば、ユーザが85として値を与えるが、条件テストが偽である場合、関数は結果として45を返さなければならない。

私は解決策を見つけることができませんでした。私はbetweenとインクリメンタルforループと一緒にifを使用しましたが、これは機能しません(条件をテストし、関数が真を返し、値を返す場所を見つけてください)。それは動作しました、この機能は、光沢のあるアプリのサーバー側に統合されるので、実装が遅くなるでしょう。これを実現する方法はありますか?もっと効率的でしょうか?前もって感謝します。

答えて

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] 
} 
+0

回答ありがとうございます。うまくいきます。私は別のRファイルに移動して後で呼び出すことができるように、 'if'ステートメントと' pos'計算を名前付き関数に入れようとしています。私は '文字変換'に 'クロージャー'を含むエラーを続けています。 'as.function'もうまくいきませんでした。何か提案はありますか? – Shan

0

あなたはこのような何か行うことができます:

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) 

に条件を変更する:あなたがあなたのデータフレームを変更することを検討かもしれませんが

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) 

を連続した数字のために働く。

こちらがお役に立てば幸いです。

関連する問題