如何向量化`[`
How to Vectorize `[`
我无法让 Vectorize
与 [
一起工作,出现如下所示的错误。从 help("[")
看来 [
的参数名为 x
、i
和 j
- 但当我将它们用作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))
Error in Vectorize([
, c("i", "j")) :
must specify names of formal arguments for '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))
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()
代替。
我无法让 Vectorize
与 [
一起工作,出现如下所示的错误。从 help("[")
看来 [
的参数名为 x
、i
和 j
- 但当我将它们用作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))
Error in Vectorize(
[
, c("i", "j")) : must specify names of formal arguments for '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))
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()
代替。