2017-10-30 5 views
2

私は輝くアプリを開発しています。値がtextBoxに入力されている場合、値はシンボルで自動的に更新されます。 textOutputにも同じことが当てはまります(つまり、値がtextOutputに表示されている場合は、%記号(100%など)で表示する必要があります。次のように使用Rshinyの動的に作成されたtextBoxに%付きのデータを追加する

RCODEは次のとおりです。

require(shiny) 

ui = fluidPage(
    fluidRow(
    column(3,numericInput("count", "No. of boxes",value = 3, min = 2, max = 10),actionButton("View","view") 
    ) 
), 
    fluidRow(uiOutput("inputGroup")), 
    fluidRow(column(3,wellPanel(textOutput("text3")))) 
) 

# takes in two arguments 
sumN <- function(a, x){ 
    a <- sum(a, as.numeric(x),na.rm=T) 
    return(a) 
} 

server <- function(input, output, session) { 

    Widgets <- eventReactive(input$View,{ input_list <- lapply(1:(input$count), 
             function(i) { 
              inputName <- paste("id", i, sep = "") 
              textInputRow <- function (inputId,value) { 
                  textAreaInput(inputName,"", width = "200px", height = "43px", resize = "horizontal") 
                  #numericInput(inputName,"",1,0,100) 
                  } 
              column(4,textInputRow(inputName, "")) }) 
    do.call(tagList, input_list)},ignoreInit = T) 

    output$inputGroup = renderUI({Widgets()}) 



    getvalues <- reactive({ 
    val <- 0 
    for(lim in 1:input$count){ 
     observeEvent(input[[paste0("id",lim)]], { 
     updateTextAreaInput(session,paste0("id",lim), value = ({ 
     x = as.numeric(input[[paste0("id",lim)]]) 
      if(!(is.numeric(x))){0} 
      else if(!(is.null(x) || is.na(x))){ 
      if(x < 0){ 
       0 
      }else if(x > 100){ 
       100 
      } else{ 
       return (isolate(input[[paste0("id",lim)]])) 
      } 
      } 
      #else{0} 
      else if((is.null(x) || is.na(x))){ 
      0 
      } 
     }) 
     ) 
     }) 
     req(as.numeric(input[[paste0("id",lim)]]) >= 0 & as.numeric(input[[paste0("id",lim)]]) <= 100) 
     val <- sumN(val,as.numeric(input[[paste0("id",lim)]])) 
    } 
    val 
    }) 

    output$text3 <- renderText({ 
    #getvalues() 
    if(getvalues() > 100){ 
     0 
    } 
    else(getvalues()) 
    }) 
} 

shinyApp(ui=ui, server = server) 

はRで、それは可能ですか?誰もこのコードで私を助けることができますか?

答えて

0

おそらくこれを行うよりエレガントな方法ですが、私はちょうどそれが動作するように書かれたようにあなたのコードを修正しようとしました。まず、私はこのヘルパー関数を追加し、その後、以下の機能を変更:

library(stringr) 
strip_percent <- function(string) { 
x <- as.numeric(str_extract(string, "[0-9]+")) 
return(x) 
} 

...

getvalues <- reactive({ 
val <- 0 
for(lim in 1:input$count){ 
    observeEvent(input[[paste0("id",lim)]], { 
    updateTextAreaInput(session,paste0("id",lim), value = ({ 
     x = strip_percent(input[[paste0("id", lim)]]) 
     if(!(is.numeric(x))){'0%'} 
      else if(!(is.null(x) || is.na(x))){ 
       if(x < 0){ 
       '0%' 
       }else if(x > 100){ 
       '100%' 
       } else{ 
       paste0(x,"%") 
       } 
      } 
      #else{0} 
      else if((is.null(x) || is.na(x))){ 
       '0%' 
      } 
    }) 
    ) 
    }) 
    req(
    strip_percent(input[[paste0("id", lim)]]) >= 0 
    & strip_percent(input[[paste0("id", lim)]]) <= 100) 
    val <- sumN(val, 
       strip_percent(input[[paste0("id", lim)]]) 
) 
} 
val 
}) 

output$text3 <- renderText({ 
#getvalues() 
if(getvalues() > 100){ 
    paste0(0, "%") 
} 
else(paste0(getvalues(), "%")) 
}) 
+0

上記のコードは正常に実行されません。最初は、すべてのTextAreaInputに0%が表示されます。しかし、値を入力すると(たとえば25)、25%と表示されます。また、追加は正しく実行されません!解決策はありますか? –

+0

%-signを削除しない限り、私にとってはうまくいきました。私は私の答えを少し編集したので、それは問題ではありません。 –

関連する問題