【问题标题】:Can anyone assist in converting an element of code in order that it will run?任何人都可以协助转换代码元素以使其运行吗?
【发布时间】:2019-08-13 17:07:19
【问题描述】:

我正在将 IDL 中提供的一些代码“翻译”成 R。

有许多元素,我目前正在努力解决其中一个问题。

以下代码广泛用于计算该值;

如果 RelAA 大于 180,则该值应转换为 360 - [表示值],如果 RelAA 小于 180,则该值应转换为 180 - [表示值]。

在IDL中是这样的;

calculate relative azimuth angle (RelAzm)
RelAA = ABS((sazm) - (vazm))
index_gt180 = where(RelAA gt 180.d)
index_lt180 = where(RelAA lt 180.d)
RelAA[index_gt180] = 360.- RelAA[index_gt180]
RelAA[index_lt180] = 180.- RelAA[index_lt180]

我尝试在 R 中使用 ifelse 函数,但不起作用。

我也尝试过使用下面的方法,但似乎没有用。

relaa[relaa > 180] = 360 - relaa[relaa > 180]
relaa[relaa < 180] = 180 - relaa[relaa < 180]

任何想法都将不胜感激。

relaa[relaa > 180] = 360 - relaa[relaa > 180]
relaa[relaa < 180] = 180 - relaa[relaa < 180]

calculate relative azimuth angle (RelAzm)
RelAA = ABS((sazm) - (vazm))
index_gt180 = where(RelAA gt 180.d)
index_lt180 = where(RelAA lt 180.d)
RelAA[index_gt180] = 360.- RelAA[index_gt180]
RelAA[index_lt180] = 180.- RelAA[index_lt180]

预期的结果将是更正值的列表

【问题讨论】:

    标签: r idl satellite


    【解决方案1】:

    不确定我是否明白您的问题,但如果我理解正确,那么您使用 ifelse 命令是正确的。

    两个示例值:

    relaa <- c(181,179)
    

    现在应用ifelse 命令,您指定需要满足什么条件(relaa &gt; 180),如果条件满足会发生什么(360 - relaa),如果条件不满足会发生什么(@987654326 @):

    relaa2 <- ifelse(relaa > 180, 360 - relaa, 180 - relaa)
    

    这会产生:

    > relaa2
    [1] 179   1
    

    这就是你要找的吗?

    【讨论】:

    • 我使用以下方法得到了结果:
    【解决方案2】:

    我已经使用下面的代码得到了答案;

    relaa = ifelse(relaa[] > 180, 360 - relaa[], ifelse(relaa[] < 180, 180 - relaa[],
    relaa[]))
    

    但是,我现在遇到的问题是结果变成了数字。我需要保留原来的“光栅”格式。

    有什么想法吗?

    【讨论】:

      【解决方案3】:

      示例数据

      library(raster)
      relaa <- raster(nrow=10, ncol=10)
      relaa <- init(relaa, "x") + 180
      

      解决方案 1

      m <- relaa > 180
      mT <- mask(relaa, m, maskvalue=TRUE)
      mT <- 180 - mT
      x <- cover(mT, 360-relaa)
      

      解决方案 2

      y <- calc(relaa, function(x) ifelse(x >= 180, 360-x, 180-x))
      

      解决方案 3(使用未导出且未经过太多测试的函数)

      z <- raster:::.ifel(relaa >= 180, 360 - relaa, 180 - relaa)
      

      解决方案 4(不推荐;因为它可能会导致内存问题)。您很接近,但您的顺序错误,以避免某些单元格值被更改两次。

      relaa[relaa < 180] = 180 - relaa[relaa < 180]
      relaa[relaa > 180] = 360 - relaa[relaa > 180]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-29
        • 2015-05-24
        相关资源
        最近更新 更多