86

光沢のあるアプリ (RStudio による) では、サーバー側に、の内容を解析して変数のリストを返すリアクティブがありますtextInput。変数のリストは、selectInputおよび/またはで使用されupdateSelectInputます。

私はそれを機能させることはできません。助言がありますか?

私は2つの試みをしました。最初のアプローチは、リアクティブoutVarを に直接使用することselectInputです。2 番目のアプローチは、リアクティブを使用することoutVarですupdateSelectInput。どちらも機能しません。

サーバー.R

shinyServer(
  function(input, output, session) {

    outVar <- reactive({
        vars <- all.vars(parse(text=input$inBody))
        vars <- as.list(vars)
        return(vars)
    })

    output$inBody <- renderUI({
        textInput(inputId = "inBody", label = h4("Enter a function:"), value = "a+b+c")
    })

    output$inVar <- renderUI({  ## works but the choices are non-reactive
        selectInput(inputId = "inVar", label = h4("Select variables:"), choices =  list("a","b"))
    })

    observe({  ## doesn't work
        choices <- outVar()
        updateSelectInput(session = session, inputId = "inVar", choices = choices)
    })

})

ui.R

shinyUI(
  basicPage(
    uiOutput("inBody"),
    uiOutput("inVar")
  )
)

少し前に、shiny-discuss に同じ質問を投稿しましたが、あまり関心がなかったので、お詫びを込めてもう一度質問します。議論/e0MgmMskfWo

編集 1

@Ramnath は、彼によってEdit 2と示されている、機能しているように見えるソリューションを親切に投稿しました。しかし、私の問題のように側面ではなく側面にあるtextinputため、その解決策は問題に対処しません。Ramnath の 2 番目の編集を横に移動すると、問題が再び発生します。つまり、何も表示されず、RStudio がクラッシュします。ラップすると問題がなくなることがわかりました。uiservertextinputserverinput$textas.character

編集 2

outVarさらなる議論の中で、Ramnath は、引数が によって返される前にサーバーが動的関数を適用しようとすると問題が発生することを示しましたtextinput。解決策は、最初にis.null(input$inBody)存在するかどうかを確認することです。

引数の存在を確認することは、光沢のあるアプリを構築するための重要な側面ですが、なぜそれを考えなかったのですか? ええ、そうしましたが、何か悪いことをしたに違いありません。私がその問題に費やした時間を考えると、それは苦い経験です. コードの後に​​、存在を確認する方法を示します。

textinput以下は横に移動したRamnath のコードserverです。RStudio がクラッシュするため、自宅では試さないでください。(私は彼の表記法を使用しました)

library(shiny)
runApp(list(
  ui = bootstrapPage(
    uiOutput('textbox'),  ## moving Ramnath's textinput to the server side
    uiOutput('variables')
  ),
  server = function(input, output){
    outVar <- reactive({
      vars <- all.vars(parse(text = input$text))  ## existence check needed here to prevent a crash
      vars <- as.list(vars)
      return(vars)
    })

    output$textbox = renderUI({
      textInput("text", "Enter Formula", "a=b+c")
    })

    output$variables = renderUI({
      selectInput('variables2', 'Variables', outVar())
    })
  }
))

私が通常存在を確認する方法は次のとおりです。

if (is.null(input$text) || is.na(input$text)){
  return()
} else {
  vars <- all.vars(parse(text = input$text))
  return(vars)
}

Ramnath のコードは短くなります。

if (!is.null(mytext)){
  mytext = input$text
  vars <- all.vars(parse(text = mytext))
  return(vars)
}

両方ともうまくいくようですが、これからはラムナスのやり方でやっていきます: 構文のアンバランスなブラケットが以前にチェックを機能させなかったのでしょうか? Ramnath のチェックはより直接的です。

最後に、さまざまなデバッグの試みについて、いくつかの点に注意したいと思います。

私のデバッグクエストで、サーバー側で「出力」の優先度を「ランク付け」するオプションがあることを発見しました。これは、問題を解決するために調査しましたが、問題が別の場所にあったため機能しませんでした。それでも、知ることは興味深いことであり、現時点ではあまり知られていないようです:

outputOptions(output, "textbox", priority = 1)
outputOptions(output, "variables", priority = 2)

そのクエストでは、私も試し tryました:

try(vars <- all.vars(parse(text = input$text)))

それはかなり近いものでしたが、それでも修正されませんでした。

私が最初に見つけた解決策は次のとおりです。

vars <- all.vars(parse(text = as.character(input$text)))

なぜそれが機能したのかを知ることは興味深いと思います.それは物事を十分に遅くするからですか? 非nullになるのをas.character「待つ」からですか?input$text

いずれにせよ、ラムナスの努力、忍耐、指導に心から感謝しています。

4

3 に答える 3

97

renderUIサーバー側で動的 UIを使用する必要があります。これは最小限の例です。2 番目のドロップダウン メニューはリアクティブで、最初のドロップダウン メニューで選択したデータセットに合わせて調整されることに注意してください。以前に光沢を扱ったことがある場合、コードは一目瞭然です。

runApp(list(
  ui = bootstrapPage(
    selectInput('dataset', 'Choose Dataset', c('mtcars', 'iris')),
    uiOutput('columns')
  ),
  server = function(input, output){
    output$columns = renderUI({
      mydata = get(input$dataset)
      selectInput('columns2', 'Columns', names(mydata))
    })
  }
))

編集。を使用した別のソリューションupdateSelectInput

runApp(list(
  ui = bootstrapPage(
    selectInput('dataset', 'Choose Dataset', c('mtcars', 'iris')),
    selectInput('columns', 'Columns', "")
  ),
  server = function(input, output, session){
    outVar = reactive({
      mydata = get(input$dataset)
      names(mydata)
    })
    observe({
      updateSelectInput(session, "columns",
      choices = outVar()
    )})
  }
))

EDIT2: を使用した修正例parse。このアプリでは、入力されたテキスト数式を使用して、下のドロップダウン メニューに変数のリストが動的に入力されます。

library(shiny)
runApp(list(
  ui = bootstrapPage(
    textInput("text", "Enter Formula", "a=b+c"),
    uiOutput('variables')
  ),
  server = function(input, output){
    outVar <- reactive({
      vars <- all.vars(parse(text = input$text))
      vars <- as.list(vars)
      return(vars)
    })

    output$variables = renderUI({
      selectInput('variables2', 'Variables', outVar())
    })
  }
))
于 2014-01-30T21:06:40.440 に答える
4

私が知る限り、問題は、関数にas 値、つまりが与えられていても、input$inBodya を取得しないことです。したがって、解決策はcharacterselectInputcharactervalue = "a+b+c"input$inBodyas.character

以下の作品:

とのobserveアプローチupdateSelectInput

observe({
     input$inBody
     vars <- all.vars(parse(text=as.character(input$inBody)))
     vars <- as.list(vars)
     updateSelectInput(session = session, inputId = "inVar", choices = vars)
})

とのreactiveアプローチselectInput

outVar <- reactive({
    vars <- all.vars(parse(text=as.character(input$inBody)))
    vars <- as.list(vars)
    return(vars)
})

output$inVar2 <- renderUI({
    selectInput(inputId = "inVar2", label = h4("Select:"), choices =  outVar())
})

編集:ラムナスのフィードバックに基づいた説明で質問を編集しました。Ramnath は問題を説明し、より良い解決策を提供してくれました。これを質問の編集として提供します。この回答は記録として残しておきます。

于 2014-01-31T22:50:39.700 に答える
3

サーバー.R

### This will create the dynamic dropdown list ###

output$carControls <- renderUI({
    selectInput("cars", "Choose cars", rownames(mtcars))
})


## End dynamic drop down list ###

## Display selected results ##

txt <- reactive({ input$cars })
output$selectedText <- renderText({  paste("you selected: ", txt() ,sep="") })


## End Display selected results ##

ui.R

uiOutput("carControls"),
  br(),
  textOutput("selectedText")
于 2015-09-10T18:28:20.227 に答える