R programming, Ifelse Error: "Error in ifelse(i %in% c(1, 6), rasterImage(ringIMG2, -22, -22, 22, 22, : replacement has length zero: "

R programming, Ifelse Error: "Error in ifelse(i %in% c(1, 6), rasterImage(ringIMG2, -22, -22, 22, 22, : replacement has length zero: "

我正在尝试 运行 基于 i 的值在 for 循环中使用同一命令的不同版本。

如果 i 等于 1 或 6 运行 则: rasterImage(ringIMG2, -22, -22, 22, 22, interpolate=FALSE, 角度=0)

如果 i 等于 2、3 或 5 运行 则: rasterImage(ringIMG2, -22, -22, 22, 22, interpolate=FALSE, 角度=0)

如果我等于 4 运行 这个: rasterImage(ringIMG2, -23.5, -23.5, 23.5, 23.5, interpolate=FALSE, 角度=0)

我正在使用嵌套的 ifelse 语句。

  for (i in 1:6)
  {
    #adjusts size of image within the plot
    ifelse(i %in% c(1,6), rasterImage(ringIMG2, -22, -22, 22, 22, interpolate=FALSE, angle =0),
           ifelse(i %in% c(2,3,5), rasterImage(ringIMG2, -23, -23, 23, 23, interpolate=FALSE, angle =0),
                  rasterImage(ringIMG2, -23.5, -23.5, 23.5, 23.5, interpolate=FALSE, angle =0)
           )
    )
    }

我不断收到以下错误:

Error in ifelse(i %in% c(1, 6), rasterImage(ringIMG2, -22, -22, 22, 22,  : 
  replacement has length zero
In addition: Warning messages:
1: In readPNG(paste0("R", i, ".png")) :
  libpng warning: iCCP: known incorrect sRGB profile
2: In rep(yes, length.out = length(ans)) :
  'x' is NULL so the result will be NULL

代码本身是 运行宁好的:

rasterImage(ringIMG2, -22, -22, 22, 22, interpolate=FALSE, angle =0)

好吧,我仍然收到第一个警告,但这不是真正的问题。

我试过简化,它似乎工作...

check <- ifelse(i %in% c(1,6), print('Yes'))
[1] "Yes"

根据下面的 link,我的语法看起来不错:

Nested ifelse syntax

ifelse(<condition>, <yes>,  
              ifelse(<condition>, <yes>, <no>)
                    )
       )

有人知道我哪里出错了吗?

谢谢!

您想使用 ifelse — 不要与 ifelse() 混淆。

ifelse() 在您想要基于条件向量创建值向量时很有用。它 return 是一个与测试条件长度相同的向量,并期望所有参数的长度相同。但是 rasterImage() 没有 return 值——将其作为参数传递给 ifelse() 等同于传递 NULLlength(i) != length(NULL),所以你得到一个错误。

但是 ifelse 是标准的控制流语句,而不是具有规定输入和输出的函数,因此更适合您的情况:

for (i in 1:6) {
  if (i %in% c(1,6)) {
    rasterImage(ringIMG2, -22, -22, 22, 22, interpolate=FALSE, angle =0)
  } else if (i %in% c(2,3,5)) {
    rasterImage(ringIMG2, -23, -23, 23, 23, interpolate=FALSE, angle =0)
  } else {
    rasterImage(ringIMG2, -23.5, -23.5, 23.5, 23.5, interpolate=FALSE, angle =0)
  }
}

您也可以在没有 if 语句的情况下更简洁地完成此操作:

for (i in c(22, 23, 23, 23.5, 23, 22)) {
  rasterImage(ringIMG2, -i, -i, i, i, interpolate=FALSE, angle =0)
}