I'm having trouble getting Vectorize to work with [, getting the error shown below. From the help("[") it seems like [ has arguments named x, i, and j - but they don't seem to work when I used them as vectorize.args. Can I do this?
## 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'
But, this works (with a warning for naming the arguments)
`[`(x=dat, i=1:2, j=1:2)
Also, if I do this, it's ok
Vectorize(`[.data.frame`, c("i", "j"))(dat, list(1:2, 2:3), list(1:2, 2:3))
Vectorize() is documented to not be usable with primitive functions. From ?Vectorize
‘Vectorize’ cannot be used with primitive functions as they do not
have a value for ‘formals’.
And [ is a primitive in R:
> `[`
.Primitive("[")
As [ is already vectorized I don't see the point of even trying this. The usual idiom for your `[`(x=dat, i=1:2, j=1:2) is simply:
dat[1:2, 1:2]
> dat[1:2, 1:2]
a b
1 1 11
2 2 12
This indices can be (pre-existing) objects too:
i <- 1:2
j <- 1:2
dat[i, j]
> dat[i, j]
a b
1 1 11
2 2 12
If you have more than one set of extractions, then I suppose you could call the [.data.frame method directly in Vectorise. The examples for ?Vectorize illustrate doing this sort of thing for function rep(), which is primitive, so uses rep.int() instead.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With