How do I coerce contents of a reactive to a data.frame?

荒凉一梦 提交于 2019-12-25 05:00:44

问题


I am having a lot of trouble adopting a good flow of object types as a shiny R reactive object is structured and moves data through my app. This is especially true if I am trying to dplyr::filter() a reactive's contents and return them to a base::data.frame or DT::data.table.

I see a lot of suggestion to "just to df()$element like any closure," but in a lot of cases (like Highcharter or using %in% to check sets) I have to store (df <- df()) before I can use x %in% df...

Say I have

> foo <- reactiveValues()
> str(foo)
List of 3
 $ impl    :Classes 'ReactiveValues', 'R6' <ReactiveValues>
  Public:
    .allValuesDeps: environment
    .dependents: environment
    .label: reactiveValues8306
    .metadata: environment
    .namesDeps: environment
    .setLabel: function (label) 
    .values: environment
    .valuesDeps: environment
    clone: function (deep = FALSE) 
    freeze: function (key) 
    get: function (key) 
    getMeta: function (key, metaKey) 
    initialize: function () 
    isFrozen: function (key) 
    mset: function (lst) 
    names: function () 
    self: ReactiveValues, R6
    set: function (key, value) 
    setMeta: function (key, metaKey, value) 
    thaw: function (key) 
    toList: function (all.names = FALSE)  
 $ readonly: logi FALSE
 $ ns      :function (x)  
 - attr(*, "class")= chr "reactivevalues"

I can store a data.frame in this reactive, as I do often when filtering:

> foo$config <- data.frame(a = c(1,2,3), b = c(4,5,6))

But, now I can only get myself in trouble:

> foo()
Error: could not find function "foo"
> foo$config
Error in .getReactiveEnvironment()$currentContext() : 
  Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)
> foo()$config
Error: could not find function "foo"

Usually at this point in the shiny-app building process I resort to trying to strong-arm the object into the form I want. Checking that object with renderPrints of calls to typeof() and class() usually tell me it is the object I'm looking for ("list", "data.table", or "data.frame") but the object will usually not conform then to the expected output of calls to renderDataTable or the aesthetic mappings in graphing libraries like ggplot or highcharter.

Can someone give me a better idea of what is going on? Related question here.

来源:https://stackoverflow.com/questions/42790422/how-do-i-coerce-contents-of-a-reactive-to-a-data-frame

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!