变量矩阵索引和行/列作为单个函数参数中的索引

时间:2015-05-13 22:22:12

标签: r

如何在单个函数参数中处理变量矩阵索引和行/列作为索引?

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个变量来非常明确地完成,但我觉得可能有更简单的方法。

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