我有两个带可选过滤功能的功能(简化):
f <- function(df, categories=NULL) {
df %>% filter(is.null(categories) || category %in% categories))
}
g <- function(df, categories=NULL) {
df %>% filter(is.null(categories) || any(categories == category))
}
然后我做了:
compare(f(x, c('a', 'b')), g(x, c('a', 'b')))
microbenchmark(f(x, c('a', 'b')), g(x, c('a', 'b')), times = 10)
在大型数据集上。两个函数的输出是相同的。实际上有一些过滤:unique(x$category)
显示了其他几个值。但是,g
显示对象长度的警告。 g
基准测试比f
更快,尽管有警告(我认为可能很贵)。
是否有更好的方法来编写/优化此功能,或者至少可以在出现安全的情况下抑制警告?
答案 0 :(得分:0)
filter
需要获得长度等于df
长度的向量。 any()
总是需要长度为1的向量。底线是g()
做的事情不同于f()
看一下这个例子
df <- data_frame(category = letters)
categories <- c("b", "a")
df$category %in% categories
categories == df$category
any(categories == df$category)
这是正确的做法
f <- function(df, categories=NULL) {
if (is.null(categories)) {
df
} else {
df %>% filter(category %in% categories))
}
}