2015-07-27 7 views
4

У меня возникли проблемы с получением Vectorize для работы с [, получив приведенную ниже ошибку. Из help("[") кажется, что [ имеет аргументы с именем x, i и j - но они не работают, когда я использовал их как vectorize.args. Я могу сделать это?Как в Vectorize `[`

## Some data 
dat <- data.frame(a=1:10, b=11:20, c=21:30) 

## Vectorize with mapply, seems to work 
f <- function(i, j, dat) list(dat[i, j]) 
mapply(f, list(1:2, 3:4), list(1:2, 2:3), MoreArgs = list(dat=dat)) 
# [[1]] 
# a b 
# 1 1 11 
# 2 2 12 
# 
# [[2]] 
# b c 
# 3 13 23 
# 4 14 24 

## Now using Vectorize, apply to data 
Vectorize(`[`, c("i", "j"))(x=dat, i=list(1:2, 2:3), j=list(1:2, 2:3)) 

Ошибка в Vectorize ([, с ("я", "J")): необходимо указать имена формальных аргументов для 'Vectorize'

Но это работает (с предупреждение для обозначения аргументов)

`[`(x=dat, i=1:2, j=1:2) 

Кроме того, если я это сделаю, это нормально

Vectorize(`[.data.frame`, c("i", "j"))(dat, list(1:2, 2:3), list(1:2, 2:3)) 
+2

'[' является примитивным и не имеет именных формальных аргументов, т. Е. 'Formals (" [") NULL' – James

ответ

10

Vectorize() задокументирован как неиспользованный с примитив функции. От ?Vectorize

‘Vectorize’ cannot be used with primitive functions as they do not 
have a value for ‘formals’. 

И [ является примитивным в R:

> `[` 
.Primitive("[") 

Как [ уже векторизованы я не вижу смысла даже пытаться это. Обычная идиома для `[`(x=dat, i=1:2, j=1:2) просто:

dat[1:2, 1:2] 

> dat[1:2, 1:2] 
    a b 
1 1 11 
2 2 12 

Эти показатели могут быть (ранее существовавших) объектов тоже:

i <- 1:2 
j <- 1:2 
dat[i, j] 

> dat[i, j] 
    a b 
1 1 11 
2 2 12 

Если у вас есть более чем один набор извлечений, то я полагаю, вы могли бы позвоните по методу [.data.frame непосредственно в Vectorise. Примеры для ?Vectorize иллюстрируют выполнение этой функции для функции rep(), которая является примитивной, поэтому вместо этого использует rep.int().

+2

@nongkrong primitve functions * do * * имеет форматы, поэтому вы не можете их получить. Если бы вы могли их получить, «Vectorize» работал бы. См. Соответствующий раздел [R Internals Manual] (https://cran.r-project.org/doc/manuals/r-release/R-ints.html#g_t_002eInternal-vs-_002ePrimitive) –