Как я могу установить значение аргумента условной функции здесь? - PullRequest
0 голосов
/ 23 мая 2018

Я хочу автоматически установить значение аргумента в функции на основе значения другого аргумента.

Более конкретно, я хочу установить значение часового пояса (offset) для автоматической настройки значений времени, учитываяregion.

Однако моя реализация, похоже, не работает (поскольку смещение никогда не применяется, если я не передам его в качестве аргумента функции).

ЧастьФункция (предполагается) устанавливает значение offset на основе значения region, а также подключается к соответствующему серверу Elasticsearch.

Вот что у меня есть:

if (region == "EU") {
    offset = "+00:00:00"
    # Code to connect to EU ElasticSearch server
  } else if (region == "US") {
    offset = "-06:00:00"
    # Code to connect to US ElasticSearch server
  } else {
  paste0(stop("Incorrect region supplied: ", region))
}

Функция:

time_function <- function(region, retailer, start_date, end_date, offset = "+00:00:00"){
    # Function body
}

(Обратите внимание, что я установил значение по умолчанию offset в "+00", в противном случае будет выдано сообщение об ошибке, что аргумент отсутствует.)

Очевидно, что я где-то ошибся, потому что смещение никогда не применяется, если я явно не укажу в списке аргументов.

Это то, что я хочу сделать:

Если region == "US", то установить offset до "-06:00:00", иначе если region == "EU", тоустановите offset на "+00:00:00" Иначе Error message: "supply valid region"

Короче, я хочу установить условное значение аргумента.

Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Оказывается, я сделал упущение в порядке реализации назначений и только что заметил его.

Для тех, кто может испытывать подобные проблемы, возможно, стоит выделить, где я ошибся: я установилзначение offset после его использования, означающее, что оно использовалось / обрабатывалось (используя значение предыдущей итерации), а затем ему было присвоено новое значение.

Короче говоря, моя реализация была полностью правильной, но порядок событий был неправильным .

Поэтому убедитесь, что вы установили необходимые значения перед их обработкой.

0 голосов
/ 23 мая 2018

Ваш код работает.

> time_function <- function(region){
+   # Function body
+   if (region == "EU") {
+     offset = "+00:00:00"
+     # Code to connect to EU ElasticSearch server
+   } else if (region == "US") {
+     offset = "-06:00:00"
+     # Code to connect to US ElasticSearch server
+   } else {
+     stop(paste0("Incorrect region supplied: ", region))
+   }
+   
+   return(offset)
+ }
> 
> time_function("EU")
[1] "+00:00:00"
> time_function("US")
[1] "-06:00:00"
> time_function("CH")
Error in time_function("CH") : Incorrect region supplied: CH

Для оптимизации вашего кода вы можете использовать переключатель.

> time_function <- function(region){
+   # Function body
+   offset <- switch(region,
+       EU = "+00:00:00",
+       US = "-06:00:00",
+       stop(paste0("Incorrect region supplied: ", region)))
+ 
+   return(offset)
+ }
> 
> time_function("EU")
[1] "+00:00:00"
> time_function("US")
[1] "-06:00:00"
> time_function("CH")
Error in time_function("CH") : Incorrect region supplied: CH

С двумя параметрами:

> time_function <- function(region){
+   # Function body
+   list2env(switch(region,
+          EU = list(offset = "+00:00:00", con = "EU_con"),
+          US = list(offset = "+00:00:00", con = "US_con"),
+          stop(paste0("Incorrect region supplied: ", region))), envir = environment())
+   
+   return(c(offset, con))
+ }
> 
> time_function("EU")
[1] "+00:00:00" "EU_con"   
> time_function("US")
[1] "+00:00:00" "US_con"   
> time_function("CH")
Error in list2env(switch(region, EU = list(offset = "+00:00:00", con = "EU_con"),  : 
  Incorrect region supplied: CH
...