创建一个接受向量并在R中返回矩阵的函数

时间:2014-11-20 23:45:33

标签: r matrix vector

我正在尝试创建一个函数,它将接收向量k并返回一个矩形长度(distMat [1,])乘以长度(k)的矩阵。 distMat是一个巨大的矩阵,indSpam是一个长向量。特别是对我的情况,长度(distMat [1,])是2412.当我作为长度为1的向量输入k时,我得到一个长度为2412的向量。我希望能够输入k作为向量长度为2,得到一个2412x2的矩阵。我试图使用while循环让它通过k的长度,但它只返回给我一个长度为2412的向量。我做错了什么?

predNeighbor = function(k, distMat, indSpam){
  counter = 1
  while (counter<(length(k)+1))
  {  
preMatrix = apply(distMat, 1, order)
orderedMatrix = t(preMatrix)
truncate = orderedMatrix[,1:k[counter]]
checking = indSpam[truncate]
checking2 = matrix(checking, ncol = k[counter])
number = apply(checking2, 1, sum)


return(number[1:length(distMat[1,])] > (k[counter]/2))
counter = counter + 1
  }
}

1 个答案:

答案 0 :(得分:0)

  

我正在尝试创建一个函数,它将接收向量k并返回一个矩形长度(distMat [1,])长度(k)的矩阵

这是一个执行此操作的功能。

foo <- function(k, distMat) {
  return(matrix(0, nrow = length(distMat[1, ]), ncol = length(k)))
}

如果您有其他要求,请用文字描述。

根据您的评论,我认为我更了解您的目标。您有一个函数返回长度为k的向量,并且您希望将其输出保存为矩阵中的行。这是一项非常常见的任务。让我们做一个简单的例子k1:10开头,并说我们想用函数foo()为它添加一些噪音,看看等级如何变化。

如果函数的输入始终相同,replicate()的效果非常好。它会自动将所有内容放在矩阵中

k <- 1:10
noise_and_rank <- function(k) {
    rank(k + runif(length(k), min = -2, max = 2))
}

results <- replicate(n = 8, expr = {noise_and_rank(k)})

在你想要迭代的情况下,即一次性的输出是下一次的输入,for循环是好的,我们只是预先分配一个0&#39;的矩阵,一次填充一列/一行

k <- 1:10
n.sim <- 8
results <- matrix(0, nrow = length(k), ncol = n.sim)
results[, 1] <- k
for(i in 2:n.sim) {
    results[, i] <- noise_and_rank(results[, i - 1])
}

您最初的问题似乎是如何进行预分配。如果输入始终相同,则使用replicate()表示您不必担心。如果每次输入不同,则使用matrix()预分配,您不需要编写任何特殊功能。