2014-10-09 75 views
1

您能解釋一下爲什麼命名函數「[」會改變它的行爲,如下面的例子..?R:「[」函數的行爲與名爲「foo」的行爲不同

library(data.table) 

d <- data.table(data.frame(a=1:10)) 
class(d) <- c(class(d), "bar") 

foo <- function(data, x) { 
    data[, .(.N), keyby=eval(substitute(x), envir=data)] 
} 

"[.bar" <- function(data, x) { 
    data[, .(.N), keyby=eval(substitute(x), envir=data)] 
} 

結果:

> d[a < 5] 
    a 
1: 1 
2: 2 
3: 3 
4: 4 
> foo(d, a < 5) 
    substitute N 
1:  FALSE 6 
2:  TRUE 4 

和:

> foo(d, a) 
    substitute N 
1:   1 1 
2:   2 1 
3:   3 1 
4:   4 1 
5:   5 1 
6:   6 1 
7:   7 1 
8:   8 1 
9:   9 1 
10:   10 1 
> d[a] 
Error in eval(expr, envir, enclos) : object 'a' not found 

他們應該工作一樣,是不是?

謝謝!

+0

你的問題不清楚。預期的輸出是什麼,錯誤是什麼?另外,因爲你沒有定義'f',所以'f(d,a)'是什麼? – Ujjwal 2014-10-09 09:05:18

+0

@Tim關於錯誤,請嘗試'd [(a)]' – akrun 2014-10-09 09:34:43

回答

1

這兩個給出相同的輸出。

> foo(d, a<5) 
    substitute V1 
1:  FALSE 6 
2:  TRUE 4 

> "[.bar"(d,a<5) 
    substitute V1 
1:  FALSE 6 
2:  TRUE 4 

請指出你在說什麼行爲改變。

1

OK,我找到了感謝誰已經刪除了他/她的回答人的問題:

class(d) <- c("bar") 

foo <- function(data, x) { 
    data <- unclass(data) 
    data <- as.data.table(data) 
    data[, .(.N), keyby=eval(substitute(x), envir=data)] 
} 

"[.bar" <- function(data, x) { 
    data <- unclass(data) 
    data <- as.data.table(data) 
    data[, .(.N), keyby=eval(substitute(x), envir=data)] 
} 

正如你看到的,這是給定類的問題。