闪亮的模块和data.table过滤器:不按预期工作

时间:2017-11-02 13:33:49

标签: r shiny data.table

我正在尝试使用闪亮的模块和data.table开发应用程序,但我无法弄清楚如何让它工作。 一个小例子是以下应用程序,它接收模块的参数作为data.table,变量和cut值,并且应该使用参数过滤data.table来打印所有结果。

library(shiny)
library(data.table)

name <-c('a','b','c','d','e')
value <- c(2,4,6,8,10)
data <- data.table(name,value)

# MODULE UI
test_UI <- function(id) {
  ns <- NS(id)
  textOutput(ns("test"))
}

# MODULE Server
test_OUT <- function(input, output, session, df, var, x) {
  output$test <- renderText({    
    d <- df[var > x, ]
    print(unique(d$name))
  })
}

# App ui 
ui <- fluidPage(
  test_UI("test")
)

# App server
server <- function(input, output,session){  
  callModule(test_OUT, "test", data, 'value', 6)
}

# App
shinyApp(ui, server)

结果是:

> a b c d e

当它应该是:

> d e

我知道如果我使用dplyr或其他过滤方法,这应该可行,但我需要data.table来提供性能,因为我正在处理非常大的数据集。 提前谢谢!

2 个答案:

答案 0 :(得分:0)

我使用“get”工作。

我换了一行:

  d <- df[var > x, ]

 d <- df[get(var) > x, ]

它有效!

答案 1 :(得分:0)

这不起作用的原因是因为data.table将自己用作环境。所以

df[var > x, ]

查找名为var的列(注意:不是var的值,而是df[["var"]])并且没有看到它,然后在父环境中查找( test_OUT功能)现在确实找到了它。它是字符向量"value"

因此,自x == 6起,比较为"value" > 6,即TRUE。这就是你获得每一行的原因。

要获得有关data.table工作原理的更多信息,请阅读文档:?data.table。它实际上非常好。

对于您的问题,请替换

d <- df[var > x, ]

d <- df[df[[var]] > x, ]

df[[var]]按名称使用列表样式的子集。