如何在单个函数参数中处理变量矩阵索引和行/列作为索引?
m <- matrix(1:9, 3)
fn <- function(m, subsetArg) {
stopifnot(m[subsetArg] == 6)
}
我希望能够同时使用这两种情况:
a <- matrix(FALSE, 3, 3)
a[2,3] <- TRUE
# yielding
# F F F
# F F T
# F F F
fn(m, subsetArgument = a) # works
和
fn(m, subsetArgument = tuple(2,3)) # <- does not work logically
请注意,我也会在使用范围后,例如tuple(2, 1:3)
我理解这可以通过测试给出的1或2个变量来非常明确地完成,但我觉得可能有更简单的方法。
答案 0 :(得分:2)
只是将所有参数捏碎并将其传递给[
:
fn <- function(...) {
stopifnot(do.call(`[`, list(...)) == 6)
}
R中的所有内容都是一个函数,包括子集: - )
答案 1 :(得分:1)
您可以使用整数矩阵对矩阵进行子集化。例如,而不是
m <- matrix(1:9, 3)
fn <- function(m, subsetArg) {
(m[subsetArg])
}
a <- matrix(FALSE, 3, 3)
a[2,3] <- TRUE
fn(m,subsetArg=a)
你可以写一下:
n <- matrix(ncol=2, byrow=TRUE, c(2,3))
m[n]
哪个也适用于你的函数,并返回相同的结果:
fn(m,subsetArg=n)
如果您创建的索引矩阵正确,您可以在元组示例中获得您正在寻找的结果:
n.tuple <- as.matrix(expand.grid(x=2, y=1:3))
m[n.tuple]
当然你可以编写一个为你做的元组函数,它可以按预期工作:
tuple <- function(x,y) {
as.matrix(expand.grid(x=x, y=y))
}
fn(m, subsetArg = tuple(2,3)) # 8
fn(m, subsetArg = tuple(2,1:3)) # 2 5 8