Может ли кто-нибудь помочь в преобразовании элемента кода для его запуска?

Я «перевожу» некоторый код, представленный в 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]

Я пытался использовать функцию ifelse в R, которая не сработала.

Я также пытался использовать приведенное ниже, но, похоже, это не сработало.

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]

Ожидаемым результатом будет список скорректированных значений


person j.rahilly    schedule 13.08.2019    source источник


Ответы (3)


Не уверен, что понял ваш вопрос, но если я правильно понял, вы были на правильном пути с командой ifelse.

Два примера значений:

relaa <- c(181,179)

Теперь применяя команду ifelse, вы указываете, какое условие нужно выполнить (relaa > 180), что произойдет, если условие будет выполнено (360 - relaa), и что произойдет, если условие не будет выполнено (180 - relaa):

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

Это дает:

> relaa2
[1] 179   1

Это то, что вы ищете?

person broesel23    schedule 13.08.2019
comment
У меня есть результат, используя следующее: - person j.rahilly; 14.08.2019

У меня есть ответ, используя приведенный ниже код;

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

Однако теперь у меня проблема, что результат стал числовым. Мне нужно сохранить исходный «растровый» формат.

Любые идеи?

person j.rahilly    schedule 14.08.2019

Пожалуйста, всегда указывайте примеры данных

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]
person Robert Hijmans    schedule 15.08.2019