8

我使用(很棒的)包 rhandsontable,稍后将包含在R闪亮的网页中。用户可以在某些地方单击,我想知道如何检索单击了哪些行的信息。这是一个示例(在R终端中复制和粘贴):

library(rhandsontable)

## Create the dataset
min = c(1,seq(2,34,by=2))
kmh = c(0,seq(7,23,by=1))
mph = round( kmh / 1.609344, digits=0 )
stop.speed = rep(FALSE, length(min))    
DF = data.frame(min, kmh, mph, stop.speed, stringsAsFactors = FALSE)

#plot the table
r = rhandsontable(DF, useTypes = TRUE)

我考虑过将其转换为R对象:

hot_to_r(r)

Error in (function (data, changes, params, ...)  : 
argument "params" is missing, with no default
4

5 回答 5

5

这个问题已有 4 年历史,但仍然与rhandsontable包用户相关。此外,上述 Lyx 提供的解决方案不再有效。以下是解决问题的简单方法。

每个rhandsontable对象都是一个深度嵌套的列表。它的元素之一是data元素,它本身嵌套在x元素之下。但是,数据是json格式的,但是可以data.frame通过使用包fromJSON()中的函数轻松地将其转换为a jsonlite

library(rhandsontable)
library(jsonlite)

hands_on_table <- rhandsontable(mtcars)
data_frame <- fromJSON(hands_on_table$x$data)
head(data_frame)

   mpg cyl disp  hp drat    wt  qsec vs am gear carb
1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

编辑:

还需要指出的是,使用hot_to_r和之间的主要区别在于jsonlite::fromJSON前者在应用程序运行时使用,而后者仅在交互式 R 会话中工作。

于 2019-06-01T21:54:47.223 回答
2

进入闪亮的应用程序后,您可以使用:

input$table_select$select$r # access the row number
input$table_select$select$c # access the column number
input$table_select$data[[input$table_select$select$r]][[input$table_select$select$c]] # access the data in a cell

您可以编写一个小函数来将行号和列号“转换”到数据框/矩阵/等中的某个位置,或者只访问上面的值。

希望这可以帮助。

于 2016-12-29T22:53:18.037 回答
1

看看shinysky包装。请注意,我还显示了包含已实施更改的表格,因此您可以检查您的工作

rm(list = ls())
library(shiny)
library(shinysky)

## Create the dataset
min = c(1,seq(2,34,by=2))
kmh = c(0,seq(7,23,by=1))
mph = round( kmh / 1.609344, digits=0 )
stop.speed = rep(FALSE, length(min))    
DF = data.frame(min, kmh, mph, stop.speed, stringsAsFactors = FALSE)

server <- shinyServer(function(input, output, session) {

  # Initiate your table
  previous <- reactive({DF})

  MyChanges <- reactive({
    if(is.null(input$hotable1)){return(previous())}
    else if(!identical(previous(),input$hotable1)){
      # hot.to.df function will convert your updated table into the dataframe
      as.data.frame(hot.to.df(input$hotable1))
    }
  })
  output$hotable1 <- renderHotable({MyChanges()}, readOnly = F)
  # You can see the changes you made
  output$tbl = DT::renderDataTable(MyChanges())
})

ui <- basicPage(mainPanel(column(6,hotable("hotable1")),column(6,DT::dataTableOutput('tbl'))))
shinyApp(ui, server)

在此处输入图像描述

于 2016-09-22T07:37:03.047 回答
1

除了shinysky,另一个解决方案是回调handsontable:

服务器.R

DF = hot_to_r(input$table)

在 ui.R 中,已使用以下方法调用表:

rHandsontableOutput("table")

然后可以将 DF 用作任何 R 数据帧

于 2016-09-23T01:02:02.170 回答
1

您可以按照以下提到的步骤在 r 3.3.1 中安装 shinysky 包:-

install.packages("devtools") 
devtools::install_github("AnalytixWare/ShinySky")

于 2016-11-03T07:33:57.840 回答