programing tip

selectInput 선택에 반응하는 R 반짝이는 전달

itbloger 2020. 12. 9. 07:53
반응형

selectInput 선택에 반응하는 R 반짝이는 전달


반짝이는 앱 (RStudio 제공)의 서버 측에는 .NET Framework 의 콘텐츠를 구문 분석하여 변수 목록을 반환하는 반응이 textInput있습니다. 그런 다음 변수 목록이 selectInput및 / 또는 에서 사용됩니다 updateSelectInput.

나는 그것을 작동시킬 수 없습니다. 어떤 제안?

나는 두 번의 시도를했다. 첫 번째 방법은 반응 형 outVarselectInput. 두 번째 방법은 반응 사용하는 것입니다 outVar의를 updateSelectInput. 둘 다 작동하지 않습니다.

server.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에 같은 질문을 올렸지 만 관심이 거의 없었기 때문에 다시 한 번 질문하겠습니다. https://groups.google.com/forum/#!topic/shiny- 토론 / e0MgmMskfWo

편집 1

@Ramnath는 작동하는 것처럼 보이는 솔루션을 친절하게 게시했으며 Edit 2 라고 표시 했습니다. 그러나 그 해결책은 문제 가 내 문제에서와 같이 측면이 아닌 측면 textinput있기 때문에 문제를 해결하지 못합니다 . 나는 이동하면 받는 사람 Ramnath의 두 번째 편집의 면이 문제 즉, 다시 작물 : 아무것도 쇼와 RStudio 충돌합니다. 나는 그 포장 발견 문제가 사라지게합니다.uiservertextinputserverinput$textas.character

편집 2

추가 논의에서 Ramnath는 outVar인수가에서 반환되기 전에 서버가 동적 함수를 적용하려고 할 때 문제가 발생한다는 것을 보여주었습니다 textinput. 해결책은 먼저 is.null(input$inBody)존재 여부를 확인하는 것입니다.

인수의 존재를 확인하는 것은 반짝이는 앱을 구축하는 데있어 중요한 부분입니다. 그런데 왜 그렇게 생각하지 않았습니까? 글쎄요,하지만 뭔가 잘못한 게 틀림 없어요! 내가 문제에 보낸 시간을 고려할 때 쓰라린 경험입니다. 코드 뒤에 존재 여부를 확인하는 방법을 보여줍니다.

아래는 Ramnath의 코드가 으로 textinput이동 한 것 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의 방식으로 할 것입니다. 아마도 내 구성의 불균형 브래킷이 이전에 내가 확인 작업을 수행하지 못하게 했습니까? 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입니까?

어떤 경우이던간에 Ramnath의 노력, 인내 및지도에 대해 매우 감사드립니다.


renderUI동적 UI를 위해 서버 측 에서 사용해야 합니다. 다음은 최소한의 예입니다. 두 번째 드롭 다운 메뉴는 반응 적이며 첫 번째 드롭 다운 메뉴에서 선택한 데이터 세트에 맞게 조정됩니다. 이전에 반짝임을 다룬 적이 있다면 코드는 자명해야합니다.

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())
    })
  }
))

지금까지 내가 말할 수있는 문제가 즉 input$inBody검색하지 않는 character짝수하지만 selectInput함수는 주어진 character즉, 값을 value = "a+b+c". 용액을 포장하는 것이다 input$inBody(A)에as.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())
})

Edit: I have edited my question with an explanation based on Ramnath's feedback. Ramnath has explained the problem and provided a better solution, which I give as an edit of my question. I'll keep this answer for the record.


server.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")

참고URL : https://stackoverflow.com/questions/21465411/r-shiny-passing-reactive-to-selectinput-choices

반응형