R блестящие данные с числовым входом и реактивной колонкой - PullRequest
0 голосов
/ 27 мая 2018

Я строю блестящую таблицу данных с одним столбцом для числового ввода, а другой реагирует на ввод.Это похоже на то, что вы можете сделать в Excel с уравнением, встроенным в ячейки.Я даю радужную оболочку в качестве примера ниже и пытаюсь вычислить площадь лепестка.Таким образом, площадь peal равна Petal.Length * Petal.Width / Adjust.Параметр регулировки будет введен пользователем для настройки области.Подобный вопрос был задан здесь, но без прямого ответа. Вставьте числовой ввод для каждой строки - R Shiny

library(shiny)
library(DT)
library(dplyr)

ui <- basicPage(

  DT::dataTableOutput('x1')
)

server <- function(input, output, session) { 
  # create a character vector of shiny inputs 
  shinyInput = function(FUN, len, id, ...) { 
    inputs = character(len) 
    for (i in seq_len(len)) { 
      inputs[i] = as.character(FUN(paste0(id, i), label = NULL, ...))
    } 
    inputs 
  } 

  # obtain the values of inputs 
  shinyValue = function(id, len) { 
    unlist(lapply(seq_len(len), function(i) { 
      value = input[[paste0(id, i)]] 
      if (is.null(value)) 1 else value 
    })) 
  } 

  # a sample data frame 
  DF <- reactive(
    iris <- iris %>%
      mutate(
        adjust = shinyInput(numericInput, nrow(iris), 'adj', value = 1),
        Petal_Area = Petal.Length*Petal.Width/shinyValue('adj', nrow(iris)) 
      )
  )

  # render the table containing shiny inputs 
  output$x1 = DT::renderDataTable(

    # use slider to control number of rows shown in table
    DF(), server = FALSE, escape = FALSE, options = list( 
      preDrawCallback = JS('function() { 
                           Shiny.unbindAll(this.api().table().node()); }'), 
      drawCallback = JS('function() { 
                        Shiny.bindAll(this.api().table().node()); } ') 
      ) 
      ) 
} 

shinyApp(ui, server)

1 Ответ

0 голосов
/ 27 мая 2018

Это неполный ответ.В надежде, что другой пользователь сможет улучшить его.Если нет, то это лучший ответ.

Я пытался примерно полчаса, но по какой-то причине (возможно, причина в том, что DT не предназначен для использования в качестве Excel), я не могу получить результат вычисления в DT -Таблица.Однако реактивность и расчет работают, если я не отображаю результат в DT -таблице!

Я внес только два изменения:

  1. Я добавил таблицу отладки
  2. Я заменил ваш dplyr -код и удалил вычисление

Код выглядит так:

library(shiny)
library(DT)

ui <- basicPage(
  DT::dataTableOutput('x1'),
  tableOutput('debug')
)

server <- function(input, output, session) { 
  # create a character vector of shiny inputs 
  shinyInput = function(FUN, len, id, ...) { 
    inputs = character(len) 
    for (i in seq_len(len)) { 
      inputs[i] = as.character(FUN(paste0(id, i), label = NULL, ...))
    } 
    inputs 
  } 

  # obtain the values of inputs 
  shinyValue = function(id, len) { 
    unlist(lapply(seq_len(len), function(i) { 
      value = input[[paste0(id, i)]] 
      if (is.null(value)) 1 else value 
    })) 
  } 

  # a sample data frame 
  DF <- reactive({
    iris_adj <- iris
    iris_adj$adjust<-shinyInput(numericInput, nrow(iris), 'adj', value = 1)
    # iris_adj$Petal_area<-iris$Petal.Length*iris$Petal.Width/shinyValue('adj',nrow(iris))
    return(iris_adj)
  })


  # render the table containing shiny inputs 
  output$x1 <- DT::renderDataTable(

    # use slider to control number of rows shown in table
    DF(), server = FALSE, escape = FALSE, options = list( 
      preDrawCallback = JS('function() { 
                           Shiny.unbindAll(this.api().table().node()); }'), 
      drawCallback = JS('function() { 
                        Shiny.bindAll(this.api().table().node()); } ') 
      ) 
      )
  output$debug<-renderTable({
    cbind(DF()[,-6],shinyValue('adj',nrow(iris)),Petal_Area=iris$Petal.Length*iris$Petal.Width/shinyValue('adj',nrow(iris)))
  })
      } 

shinyApp(ui, server)

Как только я добавлю вычисление, вывод из DT не находит пути в таблицу отладки.

О личной заметке: я помню, как использовал этот трюк shinyInput и shinyValue около полугода назад.Я также помню, что это было очень очень нестабильно. Я бы не рекомендовал его всем, кто хочет разработать стабильное приложение

Я также помню, что был еще один R-пакет для полных интерактивных таблиц.Это называется rhandsontables.Может быть, попробуйте это: https://jrowen.github.io/rhandsontable/

...