Аргумент по умолчанию для пользовательской функции один из c (...) - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь установить значение по умолчанию для функции, которую я написал, чтобы вычислить либо расстояние между растениями, которое нужно установить, либо количество саженцев на гектар на заданном расстоянии - однако аргумент для типа системы посадки может возьмите один из нескольких входов и изменит то, что функция делает соответственно. Я хотел бы, чтобы система была установлена ​​на «квадрат», если система отсутствует. Это то, что я пробовал до сих пор.

plant_spacing <- function(distance, distance_a, distance_b, system=c("square","rectangular"), stems_per_ha, area_m2=10000, output=c("stems per ha","spacing")){

  if(missing(system)){
    system=="square"
  }

  if(output=="stems per ha" & system=="rectangular"){
    area_m2/(dist_a*dist_b)
  }

  if(output=="stems per ha" & system=="square"){
    area_m2/(distance^2)
  }

  if(output=="spacing" & system=="square"){
    sqrt(area_m2/stems_per_ha)
  }
}

Это правильно, но выдает множество предупреждений:

Warning messages:
1: In if (output == "stems per ha" & system == "rectangular") { :
  the condition has length > 1 and only the first element will be used
2: In if (output == "stems per ha" & system == "square") { :
  the condition has length > 1 and only the first element will be used
3: In if (output == "spacing" & system == "square") { :
  the condition has length > 1 and only the first element will be used

Есть ли лучший способ сделать это? Заранее спасибо.

1 Ответ

1 голос
/ 26 марта 2020

Каждый оператор if в R должен иметь одно логическое значение, но ваши сравнения приводят к длине 2 логических векторов.

system=c("square","rectangular")
output=c("stems per ha","spacing")
output=="stems per ha" & system=="rectangular"
[1] FALSE FALSE

Вместо этого просто определите значение по умолчанию в функции. И тогда пользователь может изменить значение при необходимости.

plant_spacing <- function(distance, 
                          distance_a, 
                          distance_b, 
                          system="square", 
                          stems_per_ha,
                          area_m2=10000, 
                          output="stems per ha"){

  return(c(system,output))
}
plant_spacing()
[1] "square"       "stems per ha"
plant_spacing(system = "rectangular")
[1] "rectangular"  "stems per ha"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...