Как повторно использовать код в функции R?

У меня есть блок кода, который я хочу использовать несколько раз внутри функции (давайте назовем его myFunction). Естественно, я хочу избежать дублирования этого блока кода, но я не могу найти способ его повторного использования, за исключением помещения его во внешний файл и получения его каждый раз.

Первым делом я попытался поместить дублированный код во внутреннюю мини-функцию без аргументов (назовем ее internalFunction, Это означало, что я мог позвонить internalFunction по мере необходимости; однако, это замаскировало объекты, выведенные internalFunction из основной среды myFunction,

Затем я попытался с помощью <<- оператор для назначения выходных объектов в internalFunction, чтобы они были доступны для основной среды myFunction, К сожалению, это также делает эти объекты доступными для глобальной среды R за пределами myFunction, которого я хочу избежать.

Есть ли способ записи блока кода R в объект и последующего его вызова или поиска из объекта вместо файла? Я бы очень хотел: а) избежать дублирования кода и б) включить весь код в один файл.

2 ответа

Решение

Я думаю, что вы хотите, чтобы был какой-то простой способ вернуть несколько значений вызывающей функции, это можно сделать с помощью списка, как показано ниже:

maxmin <- function(i1,i2){

  if (i1>i2){
    mx <- i1
    mn <- i2
  }  else
  {
    mn <- i1
    mx <- i2
  }
  rv <- list(min=mn,max=mx)
  return(rv)
}

r1 <- maxmin(3,4)
r2 <- maxmin(6,5)

print(sprintf("minimums %d %d",r1$min,r2$min))
print(sprintf("maximums %d %d",r1$max,r2$max))

Редактировать: я избавился от кавычек для имен элементов списка, они не нужны

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

fun1 <- function(x)
{
    maxminenv <- function(i1,i2){
      if (i1>i2){
        mx <- i1
        mn <- i2
      }  else
      {
        mn <- i1
        mx <- i2
      }
      penv <- parent.frame()
      penv$min <- mn
      penv$max <- mx
    }
    maxminenv(3,4)
    print(sprintf("min:%d max:%d",min,max))
}
fun1()

Для получения дополнительной информации об окружающей среде см. Эту превосходную главу в новой книге Хэдли Викама. http://adv-r.had.co.nz/Environments.html

Другие вопросы по тегам