我正在尝试创建一个函数,它将接收向量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
}
}
答案 0 :(得分:0)
我正在尝试创建一个函数,它将接收向量k并返回一个矩形长度(distMat [1,])长度(k)的矩阵
这是一个执行此操作的功能。
foo <- function(k, distMat) {
return(matrix(0, nrow = length(distMat[1, ]), ncol = length(k)))
}
如果您有其他要求,请用文字描述。
根据您的评论,我认为我更了解您的目标。您有一个函数返回长度为k
的向量,并且您希望将其输出保存为矩阵中的行。这是一项非常常见的任务。让我们做一个简单的例子k
以1: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()
预分配,您不需要编写任何特殊功能。