Передача аргументов по умолчанию через вложенные функции в R - PullRequest
0 голосов
/ 24 мая 2018

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

В основном у меня есть три функции, и я хочу, чтобы у некоторых элементов были значения по умолчанию во всех трех.Эти функции вызываются друг в друга, но иногда вызываются по отдельности (то есть foo1 вызывает foo2, а foo2 вызывает foo3, но иногда я называю просто foo3 или foo2).

Отредактировано, чтобы уточнить: я ищу способ передать wd (и в моей реальной проблеме) несколько других переменных с уровня вызываемой функции, без необходимости записывать их в каждомвызов функции.То есть я хочу установить значение по умолчанию wd на всех уровнях.Чтобы не называть их по-разному, это сбивает с толку, если вы хотите по отдельности вызывать функции, которые я пробовал, имея wd = wd в вызове функции каждого (стремясь получить доступ к wd из функции, которую он вызывает.Есть ли лучший способ передать аргумент так, чтобы при вызове внутри другой функции он передавал аргумент?

Мой первый пример работает, показывает рабочий код, однако каждый раз, когда я вызываю другие функции внутри одной, я имеючтобы указать, что wd = wd, что, когда это число аргументов, и я вызываю функции несколько раз / в пределах ddply, делает скрипт неудобным для работы.

Второй пример - это то, чем я былнадеясь, что в среде, из которой он был вызван, wd по умолчанию установлено на wd, но это, очевидно, не допускает появления ошибки. Каков наилучший подход к передаче аргумента без необходимости его постоянного присваивания?

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

Пример 1: работает нормально, но значения по умолчанию не установлены.

foo1 <- function(x, wd, reps){

  filename = paste0("Event", x)
  myString <- foo2(file = filename, wd = wd)
  rep(myString, reps)
}

foo2 <- function(file,wd){
  filePath <- file.path(wd,file)
  foo3(Path = filePath, wd = wd)
}

foo3 <- function(Path, wd){
  paste("Absolute File path is:", Path, "Current working Dir is:", wd)
}

foo1(1, wd = "c:/temp", 2)
foo2("C:/temp/otherfilename")

Пример 2:

foo2 <- function(file,wd){
  filePath <- file.path(wd,file)
  foo3(Path = filePath)
}

foo3 <- function(Path, wd=wd){
  paste("Absolute File path is:", Path, "Current working Dir is:", wd)
}
foo1(1, wd = "c:/temp", 2)
> Error in paste("Absolute File path is:", Path, "Current working Dir is:",  : 
         promise already under evaluation: recursive default argument reference or earlier problems? 

1 Ответ

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

Я думаю, вам не следует пытаться повторно использовать одно и то же имя в разных средах.Построение возможно повторяющегося вопроса в обещании, которое уже находится на стадии оценки: рекурсивная ссылка на аргумент по умолчанию или более ранние проблемы? и некоторые объяснения из http://adv -r.had.co.nz / Environments.html # function-envs :

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

foo1 <- function(x, wd. = wd, reps){
  filename = paste0("Event", x)
  myString <- foo2(file = filename, wd.. = wd.)
  rep(myString, reps)
}

foo2 <- function(file, wd.. = wd){
  filePath <- file.path(wd.., file)
  foo3(Path = filePath)
}

foo3 <- function(Path, wd... = wd){
  paste("Absolute File path is:", Path, "Current working Dir is:", wd...)
}

РЕДАКТИРОВАТЬ в ответ на обсуждение комментариев.Приведенный ниже код может лучше реализовать ваши намерения и работать с вашими тестовыми вызовами foo1(1, wd = "c:/temp", 2) и foo2("C:/temp/otherfilename"):

foo1 <- function(x, ..., reps){
  filename = paste0("Event", x)
  myString <- foo2(file = filename, wd = wd)
  rep(myString, reps)
}

foo2 <- function(file, ...){
      filePath <- file.path(wd, file)
  foo3(Path = filePath)
}

foo3 <- function(Path, ...){
  paste("Absolute File path is:", Path, "Current working Dir is:", wd)
}
...