【问题标题】:What kind of object is this, reactive?这是什么类型的对象,反应性的?
【发布时间】:2016-10-31 02:53:29
【问题描述】:

我的 Server.R 中有这段代码:

selection1 <- reactive({filter(filter(DF1, PC %in% input$dynamic),
                   AGE >= input$age[1] & AGE <= input$age[2])})

DF1 当然是一个数据框对象,input$dynamic 是一个复选框组输入,input$age 是一个滑块输入。但是selection1 是一个什么样的对象呢?也是数据框吗?

然后我想在selection1 中计算变量COMMUN 中唯一出现的次数,所以我尝试了这个:

selection2 <- length(unique(selection1$COMMUN))

但是我有这个错误信息:

警告:$ 中的错误:“闭包”类型的对象不是子集

请问这个操作怎么做?

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    selection1 是一个reactive 函数。在 Shiny 中,这意味着它是一个保存/缓存数据的函数。当您调用该函数并且它的输入发生变化时,它所保存的数据会更新。如果调用时输入没有改变,它会返回缓存的数据。

    要访问数据,您需要使用selection1() 调用函数本身,然后使用通常的函数/代码来对数据进行子集化。所以在你的情况下,它会是

    selection2 <- length(unique(selection1()$COLUMN))
    

    您看到的错误是您尝试对函数执行 $ 操作而不使用 () 调用函数时的标准错误

    foo <- function(){
        bar = data.frame(bar = c(1,2,3))
    }
    
    foo$bar
    Error in foo$bar : object of type 'closure' is not subsettable
    
    foo()$bar
    [1] 1 2 3
    

    如果您想深入了解reactive 对象的结构的实际细节,只需在其上调用str 并查看

    foo <- reactive()
    
    str(foo)
    
    function ()  
     - attr(*, "observable")=Classes 'Observable', 'R6' <Observable>
      Public:
        .dependents: environment
        .domain: NULL
        .error: FALSE
        .execCount: 0
        .func: function (...) 
        .invalidated: TRUE
        .label: foo
        .mostRecentCtxId: 
        .running: FALSE
        .updateValue: function () 
        .value: NULL
        .visible: 
        clone: function (deep = FALSE) 
        getValue: function () 
        initialize: function (func, label = deparse(substitute(func)), domain = getDefaultReactiveDomain(), 
        self: Observable, R6 
     - attr(*, "class")= chr "reactive"
    

    【讨论】:

    • 嗨 SymbolixAU,非常感谢您的回答,我现在明白了。请再问一个问题:我必须在变量 PC ==“01”上过滤 selection1。是否可以在同一行中使用 selection1 过滤器和 selection2 长度/唯一标准来获得更短的代码?我没能做到。谢谢。
    • @Mickey_NC - 我不明白你在问什么。你是说selection1()[ PC == "01", "COLUMN"] 吗?
    • 我必须在变量 PC = "01" 上过滤 selection1,然后获取长度(唯一(selection1$COMMUN)),如果可能的话,我想执行这些 "filter" + "同一行(selection2
    • @Mickey_NC - 在这种情况下length(unique(selection1()[ selection1()$PC == "01", "COLUMN"])) 应该可以工作吗?
    • 太棒了!非常感谢 SymbolixAU 的这些解释和你最后一个完美的建议。祝您有愉快的一天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2020-03-07
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多