Как заставить mutate работать с реактивными по числовым именам столбцов? - PullRequest
0 голосов
/ 28 сентября 2019

Я не знаю, как соединить mutate с реактивным, когда имеешь дело с именами числовых столбцов.

У меня есть данные, которые выглядят примерно так:

df <- tibble(a=c("a", "b", "c"), `1990`=c(1,2,3), `2010`=c(3,2,1))

Все выглядит нормально, когда я делаю:

p <- df %>%
  mutate(newvar = `1990`)

Но я хочу использовать его в моем приложении Shiny, чтобы newvar было назначено входу из списка выбора.

Я создал этореагирует на это;

  selectedyear <- reactive({
    input$select
  })

Но теперь это, похоже, не работает:

p <- df %>%
  mutate(newvar = selectedyear())

Я пробовал разные модификации, например:

p <- df %>%
  mutate(newvar = `selectedyear()`)

, но ничегоКажется, работает для меня.

Полный код приложения:

library(shiny)
library(tibble)
library(dplyr)

df <- tibble(a=c("a", "b", "c"), `1990`=c(1,2,3), `2010`=c(3,2,1))

ui <- fluidPage(
  selectInput("select", "Select:", c(1990, 2010)),
  tableOutput("val")
)
server <- function(input, output) {
  selectedyear <- reactive({
    input$select
  })
  output$val <- renderTable({
    p <- df %>%
      mutate(temperature = selectedyear())
    p
  })
}
shinyApp(ui, server)

То же самое, но с вводом символов легко.Знаете ли вы какой-нибудь взломать вокруг этого?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2019

Похоже, проблема заключается в несинтаксическом названии столбцов 1990, 2010.Подход ниже должен работать.Он использует eval / parse внутри правой стороны вызова mutate.Обратите внимание, что вам обычно не нужно создавать reactive с (и только с) входами, потому что каждый вход уже реактивен.

library(shiny)
library(tibble)
library(dplyr)

df <- tibble(a=c("a", "b", "c"), `1990`=c(1,2,3), `2010`=c(3,2,1))

ui <- fluidPage(
  selectInput("select", "Select:", c(1990, 2010)),
  tableOutput("val")
)
server <- function(input, output) {


  output$val <- renderTable({

       df %>%
          mutate(temperature = eval(parse(text = paste0("`", input$select,"`"))))

  })
}
shinyApp(ui, server)

Если вас интересует только столбец температуры, а вы нетнеобходимо показать остальные данные, тогда dplyr::select позволяет получить доступ к переменной input$select гораздо более простым способом:

  output$val <- renderTable({

    df %>% 
      select(temperature = input$select)

  })
0 голосов
/ 28 сентября 2019

Вы можете сделать

  output$val <- renderTable({
    p <- df %>%
      mutate(temperature = !!selectedyear())
    p
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...