R 使用条件ifelse函数指定矩阵将导致0值

R 使用条件ifelse函数指定矩阵将导致0值,r,if-statement,matrix,conditional,R,If Statement,Matrix,Conditional,我试图创建一个密度相关的Leslie矩阵工具,将给定时间的总人口循环回公式中,并调整下一次迭代(到给定终点)的存活率和/或出生率(即Leslie矩阵)。下面的代码嵌入到了更大的函数中,但我可以看到这部分有一些不完整的地方。请注意,为了简洁起见,我只提取了相关代码,并检查了它的行为是否与大函数中的行为相同 当我运行下面的代码时,它不是返回矩阵的条件ifelse函数,而是返回0。变量L.new应等于示例中的4 x 4矩阵L 如何获得返回矩阵的条件,为什么这段代码返回0而不是矩阵 b.r <-

我试图创建一个密度相关的Leslie矩阵工具,将给定时间的总人口循环回公式中,并调整下一次迭代(到给定终点)的存活率和/或出生率(即Leslie矩阵)。下面的代码嵌入到了更大的函数中,但我可以看到这部分有一些不完整的地方。请注意,为了简洁起见,我只提取了相关代码,并检查了它的行为是否与大函数中的行为相同

当我运行下面的代码时,它不是返回矩阵的条件ifelse函数,而是返回0。变量
L.new
应等于示例中的4 x 4矩阵
L

如何获得返回矩阵的条件,为什么这段代码返回0而不是矩阵

b.r <- c(0, 1, 5, 0)

surv.rates <- rbind( 
    age1 = c(0.3, 0.0, 0.0, 0.0),
    age2 = c(0.0, 0.6, 0.0, 0.0), 
    age3 = c(0.0, 0.0, 0.8, 0.0))

surv.rates2 <- rbind(     
    age1 = c(0.3/2, 0.0, 0.0, 0.0),
    age2 = c(0.0, 0.6/2, 0.0, 0.0), 
    age3 = c(0.0, 0.0, 0.8/2, 0.0))

surv.rates3 <- rbind(     
    age1 = c(0.3/4, 0.0, 0.0, 0.0),
    age2 = c(0.0, 0.6/4, 0.0, 0.0), 
    age3 = c(0.0, 0.0, 0.8/4, 0.0))

L  <- rbind(births = b.r, surv.rates)
L2 <- rbind(births = b.r, surv.rates2)
L3 <- rbind(births = b.r, surv.rates3)


t1 <- 10
t2 <- 100

L.new <- ifelse(1 > t2, yes = L3, 
                no = ifelse(1 > t1, yes = L2, 
                            no = L))
L.new # should equal matrix `L`

ifelse
是矢量化的,因此选择
yes
/
no
选项的相应元素(即第一个元素,因为
test
的长度为1)。也许这样行得通

L.new <- if (1 > t2) L3 else if (1>t1) L2 else L
L.新建t2)L3 else if(1>t1)L2 else L
或者更清楚地说:

if (1>t2) {
   L.new <- L3 
} else if (1>t1) {
   L.new <- L2
} else L.new <- L
if(1>t2){
L.新技术(t1){

谢谢你,博克先生。这两种方法都有效。奇怪的是,
ifelse
做任何强制,因为你确切地告诉它分配什么…从现在起,我可能只依赖
if
else
。我不知道这是否是强制,而矩阵只是一个有维度的向量。Since
ifelse
是矢量化的,它只取向量/矩阵的第一个值,如:
ifelse(1>2,yes=matrix(1:3),no=matrix(3:1))
。可能需要技巧,使函数返回列表中的矩阵,如:
ifelse(1>2,yes=list(matrix(1:3)),no=list(matrix(3:1)))
。不过,
如果
那么
否则
仍然更可取。
if (1>t2) {
   L.new <- L3 
} else if (1>t1) {
   L.new <- L2
} else L.new <- L