如何对 `[` 进行向量化处理

4

我在使用[进行向量化时遇到了困难,出现了下面的错误。从help("[")中可以看出,[有名为xij的参数,但是当我将它们用作vectorize.args时似乎无法工作。我能这么做吗?

## 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([, c("i", "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
1个回答

10

Vectorize()文档中记录不能与primitive函数一起使用。来自?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

如果您有多组抽取数据,则可以直接在Vectorise中调用[.data.frame方法。 ?Vectorize的示例说明了如何对原始函数rep()执行此类操作,因此使用rep.int()


2
@nongkrong原始函数没有形式参数,因此您无法获取它们。如果您可以获取它们,则Vectorize将起作用。请参阅R Internals Manual的相关部分。 - Gavin Simpson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接