R Shiny: Изменить выходные значения в кадре данных - PullRequest
0 голосов
/ 30 августа 2018

Следующее простое блестящее приложение отображает слово и его настроение, сохраненные во фрейме данных R с именем sent.

library(shiny)

sent <- data.frame(word=c('happy', 'sad', 'joy', 'upset'),
                   sentiment=c('positive', 'negative', 'positive', 'negative'),
                   stringsAsFactors = FALSE)


ui <- fluidPage(
  numericInput(inputId = 'num', label='', value=1, min=1, max=nrow(sent)),
  br(),
  h4("Word:"),
  textOutput('word'),
  br(),
  h4("Sentiment:"),
  textOutput('sentiment')
)

server <- function(input, output){
  output$word <- renderText({ sent$word[input$num] })
  output$sentiment <- renderText({ sent$sentiment[input$num] })
}

shinyApp(ui=ui, server=server)

Я бы хотел изменить это двумя способами:

(1) Я бы хотел, чтобы пользователь мог прокручивать слова в столбце sent$word вместо использования numericInput()

(2) Что еще более важно, я бы хотел, чтобы пользователь мог изменять значение настроения, связанное с каждым словом. В идеале это должно быть выпадающее меню (с опциями «положительный» и «отрицательный»), в котором будет отображаться текущее значение настроения, сохраненное в sent для этого слова, но которое может быть изменено пользователем и переопределено в dataframe.

Есть предложения?

1 Ответ

0 голосов
/ 30 августа 2018

Это должно сработать

 library(shiny)

 sent <- data.frame(word=c('happy', 'sad', 'joy', 'upset'),
                   sentiment=c('positive', 'negative', 'positive', 'negative'),
                   stringsAsFactors = FALSE)

 sent2 <- reactiveVal(sent)

 i <- 1
 i2 <- reactiveVal(i)

 ui <- fluidPage(
  uiOutput("wordSelect"),
  br(),
  h4("Word:"),
  textOutput('word'),
  br(),
  h4("Sentiment:"),
  textOutput('sentiment'),
  br(),
  uiOutput("change"),
  actionButton("go","Change")
)

 server <- function(input, output){

  output$wordSelect <- renderUI({
    selectizeInput(inputId = 'wrd', label='select word', choices=sent$word, selected=sent$word[i2()])
  })

  output$word <- renderText({ input$wrd })
  output$sentiment <- renderText({  sent$sentiment[which(sent2()$word==input$wrd)] })

 observeEvent(input$go, {
    out <- sent
    out$sentiment[which(sent$word==input$wrd)] <- input$newLabel
    sent <<- out
    sent2(out)
    i <<- which(sent$word==input$wrd)+1
    if(i > length(sent$word)) {
      i <<- i - 1
    }
    i2(i)
})

  output$change <- renderUI({
    radioButtons("newLabel", label="Change value", choices=c('positive','negative'), sent$sentiment[which(sent2()$word==input$wrd)])
  })

  }

shinyApp(ui=ui, server=server)

Скорректированный выход сначала сохраняется в реактиве VAL с именем sent2(). Это необходимо для того, чтобы вы увидели значения приставки при запуске приложения Shiny.

A selectizeInput() используется для прокрутки слов (Q1).

radioButtons() используются для выбора значений positive и negative. Значением по умолчанию является любое значение, которое в настоящее время применяется к соответствующему слову.

actionButton() используется для внесения изменений при желании.

ОБНОВЛЕНИЕ: я добавил sent <<- out, чтобы ваш sent кадр данных действительно обновлялся. Имейте в виду, что это заменит значения, которые вы сохранили в sent ранее.

ОБНОВЛЕНИЕ: При каждом нажатии кнопки действия индекс текущего выбранного слова определяется с помощью which(). Затем он увеличивается и сохраняется в i и i2(). Новый индекс используется для определения значения по умолчанию selectizeInput(). Таким образом, когда ручной выбор слов не выполняется, вы будете прокручивать все варианты. Когда слово выбрано вручную, вы продолжите увеличиваться с этого слова. При достижении последнего слова значение не увеличивается далее

...