web-dev-qa-db-ja.com

selectInput()でデフォルトの選択を強制しない

Shiny documentationselectInput()について言及しています:

selectedデフォルトで選択されるナビゲーション項目の値(または、何も指定されていない場合はタイトル)。 NULLの場合、最初のナビゲーションが選択されます。

デフォルトで選択リストから値を選択したくない場合はどうなりますか?

実際、私の選択値はデフォルトで選択されており、アプリの残りの部分は自動的に実行されています。ただし、最初は値を選択したくありません。そのためには、selectInput()selected引数に何を指定すればよいですか?


確かに、何も自動的に選択されたくありません。以下のコードを使用しましたが、それでもリストから利用可能な最初の値を選択しています。デフォルトでは何も選択しないようにしたいので、ユーザーは任意のオプションを選択できます。

output$Choose_App <- renderUI({
selectInput("app",
            "Select App:",
            choices = as.character(mtrl_name),
            selected = NULL ,
            multiple = FALSE
           )
        })

documentation をたどると、multiple=TRUEを選択した場合にのみ、選択が空になることに気付きました。これは正しいです?

multiple=TRUEに変更すると、デフォルトで選択されないため、これが必要です。しかし、残念ながら選択を行う前に、次のエラーメッセージも表示されます。

ERROR: bad 'file' argument 

私が何か間違ったことをしている場合、誰かがこれについて知っていますか?しかし、このファイルを選択すると、エラーはなくなります。

enter image description here

これには次のコードを使用しています。

# server.R
setwd("/opt/shiny-server/samples/sample-apps/P-Dict_RDS2")
mtrl_name <- try(system("ls | grep -i .rds", intern = TRUE))

shinyServer(function(input, output) {

# First UI input (Service column) filter clientData 
output$Choose_Molecule <- renderUI({
selectInput("molecule",
            "Select Molecule:",
            choices = as.character(mtrl_name),
            selected = input$molecule,
            multiple = TRUE
           )
        })
27
Piyush

Select入力の代わりにselectize入力を使用できます。一部のカスタムselectizeオプションを使用して、初期選択を空に設定できます。 は、Shiny Galleryで提供されています。特に、例6を参照してください。

# make sure you have shiny >= 0.9.1
selectizeInput(
  'e6', '6. Placeholder', choices = state.name,
  options = list(
    placeholder = 'Please select an option below',
    onInitialize = I('function() { this.setValue(""); }')
  )
)

ところで、エラー"ERROR: bad 'file' argument"、あなたのアプリのソースコードを見ずに誰かがあなたを助けることができるとは思いません、そしてそれは別の質問かもしれません。

13
Yihui Xie

同様の問題に直面しました。私が見つけた解決策は、@ MKaの答えに基づいています。コードが複数の値を処理できない場合は、multiple = Tを設定しないでください。私が提案するのは:

selectInput("molecule",
            "Select Molecule:",
            choices = c("",as.character(mtrl_name)),
            selected = NULL,
            multiple = F
           ) 

選択した値を取得するには:

if(!is.null(input$molecule))
{
  if(nchar(input$molecule)>1)
  {
    #do your thing..
  }
}

私の問題を修正しました。より良い解決策を見つけた場合はお知らせください。

10
rookieJoe

空の文字列を選択リストに追加することで回避できると思います。

selectInput("app", 
"Select App:", 
choices = c("", as.character(mtrl_name)), 
selected = NULL, 
multiple = FALSE)
8
MKa

@Yihui Xieの answer にはselectInput(..., selectize = TRUE)が必要です。 selectize = FALSEが必要な場合でも、次のように同様の効果を得ることができます。

これは 文書化 ではありません:

selected最初に選択された値(またはmultiple = TRUEの場合は複数の値)。指定しない場合、デフォルトでは単一選択リストの最初の値になり、複数選択リストの値はありません。

ただし、単一選択リストでselectize = FALSE, size = 4を使用できる場合(NULL以外のサイズでも機能します)、selected = FALSEを設定してデフォルトの選択を強制しないことができます。

library(shiny)

# Define UI for application that draws a histogram
ui <- fluidPage(
      mainPanel(
         uiOutput("Choose_Molecule")
      )
)

# Define server logic required to draw a histogram
server <- function(input, output) {

    # First UI input (Service column) filter clientData 
    output$Choose_Molecule <- renderUI({
        selectInput("molecule",
                    "Select Molecule:",
                    choices = rownames(mtcars),
                    selected = FALSE,
                    multiple = FALSE
                    , selectize = FALSE, size = 4  ##needed for `selected = FALSE` to work
        )
    })

}

# Run the application 
shinyApp(ui = ui, server = server)

enter image description here

0
landroni