我在让 Vectorize[ 一起工作时遇到问题,出现如下所示的错误。从 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))



但是,这是有效的(带有命名参数的警告)
`[`(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))

最佳答案

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() 代替。

关于r - 如何矢量化 `[`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31658451/

10-12 17:53