我正在尝试使用闪亮的模块和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来提供性能,因为我正在处理非常大的数据集。 提前谢谢!
答案 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]]
按名称使用列表样式的子集。