【问题标题】:how to set Shiny::toJSON args from custom update***Input function?如何从自定义更新***输入函数设置 Shiny::toJSON 参数?
【发布时间】:2015-08-07 07:07:31
【问题描述】:

我正在为 Shiny 开发一个custom input binding。我有一个data.table,我正在传递给一个javascript。不幸的是,数据需要按行而不是按列进行编码。 private$inputMessageQueueprocesssed 没有额外的参数,所以没有地方覆盖shiny::toJSON 默认参数。我怎样才能得到我需要的格式?

接收我的data.table(如message$data)的闪亮函数

debugging in: session$sendInputMessage(inputId, message)
debug: {
    data <- list(id = inputId, message = message)
    private$inputMessageQueue[[length(private$inputMessageQueue) + 
        1]] <- data
}

我的data.table的结构:

Browse[4]> str(message$data)
Classes ‘data.table’ and 'data.frame':  8 obs. of  7 variables:
 $ coOrdinate       : chr  "c1" "c2" "c3" "c4" ...
 $ injectionSite    : Factor w/ 2 levels "head","body": NA NA NA NA NA NA NA NA
 $ drug             : Factor w/ 2 levels "aconitin","nicotine": NA NA NA NA NA NA NA NA
 $ drugConcentration: num  NA NA NA NA NA NA NA NA
 $ bath             : Factor w/ 2 levels "aconitin","nicotine": NA NA NA NA NA NA NA NA
 $ bathConcentration: num  NA NA NA NA NA NA NA NA
 $ status           : Factor w/ 3 levels "active","dead",..: 1 1 1 1 1 1 1 1
 - attr(*, ".internal.selfref")=<externalptr> 

data.table中的实际数据:

Browse[4]> message$data
   coOrdinate injectionSite drug drugConcentration bath bathConcentration status
1:         c1            NA   NA                NA   NA                NA active
2:         c2            NA   NA                NA   NA                NA active
3:         c3            NA   NA                NA   NA                NA active
4:         c4            NA   NA                NA   NA                NA active
5:         c5            NA   NA                NA   NA                NA active
6:         c6            NA   NA                NA   NA                NA active
7:         c7            NA   NA                NA   NA                NA active
8:         c8            NA   NA                NA   NA                NA active

我想让Shiny做什么:

Browse[4]> jsonlite::toJSON(message$data)

[
    {"coOrdinate":"c1","status":"active"},
    {"coOrdinate":"c2","status":"active"},
    {"coOrdinate":"c3","status":"active"},
    {"coOrdinate":"c4","status":"active"},
    {"coOrdinate":"c5","status":"active"},
    {"coOrdinate":"c6","status":"active"},
    {"coOrdinate":"c7","status":"active"},
    {"coOrdinate":"c8","status":"active"}
] 

处理 private$InputMessageQueue 时 Shiny 会做什么(见 shiny.R

jsonlite::toJSON(I(message$data),dataframe='columns',null='null', na='null', auto_unbox=T, force=T, rownames=F, keep_vec_name=T)

{
    "coOrdinate":["c1","c2","c3","c4","c5","c6","c7","c8"],
    "injectionSite":[null,null,null,null,null,null,null,null],
    "drug":[null,null,null,null,null,null,null,null],
    "drugConcentration":[null,null,null,null,null,null,null,null],
    "bath":[null,null,null,null,null,null,null,null],
    "bathConcentration":[null,null,null,null,null,null,null,null],
    "status":["active","active","active","active","active","active","active","active"]
}

如果一切都失败了,我可以将我的 data.table 转换为矩阵。这将为我提供按行排列的 JSON,但我会丢失列名:

Browse[4]> jsonlite::toJSON(I(as.matrix(message$data)),dataframe='columns',null='null', na='null', auto_unbox=T, force=T, rownames=F, keep_vec_name=T)

[
    ["c1",null,null,null,null,null,"active"],
    ["c2",null,null,null,null,null,"active"],
    ["c3",null,null,null,null,null,"active"],
    ["c4",null,null,null,null,null,"active"],
    ["c5",null,null,null,null,null,"active"],
    ["c6",null,null,null,null,null,"active"],
    ["c7",null,null,null,null,null,"active"],
    ["c8",null,null,null,null,null,"active"]
] 

那么,我怎样才能强制 Shiny 逐行传递我的 data.frame?

【问题讨论】:

  • 哇,你对 Shiny 的源代码挖掘得真深 :)

标签: r shiny inputbinding


【解决方案1】:

您可以简单地使用 jsonlite::toJSON() 对您的 R 数据进行预编码,并将编码后的 JSON 字符串传递给 shiny。它将被视为逐字 JSON 字符串,而不是被双重编码(例如,"[1,2]" 不会再次编码为 "\"[1,2]\"")。这是因为我们在jsonlite::toJSON() (PR#795) 中使用了参数json_verbatim = TRUE。这需要 闪亮 >= 0.12.0。

【讨论】:

  • 太棒了!这让我头疼。
猜你喜欢
  • 2019-02-15
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多