2015-11-02 80 views
1

我有可選的濾波兩個函數(簡化):正確的結果,但警告,較長物體長度不短對象長度的倍數

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

對於[代碼評論](http://codereview.stackexchange.com/),這可能是一個更好的問題。 – JasonAizkalns

+0

確定嗎?正如我所說的,輸出是正確的和相同的。 'FALSE || FALSE'將不正確。 –

回答

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)) 
    } 
} 
的正確方法
+0

那麼爲什麼它會起作用,又怎麼會出錯呢? –