通过R

时间:2018-05-24 02:17:38

标签: r function nested parameter-passing

我有一个关于通过R中的嵌套函数传递默认参数的一般性问题。我的例子(显然)是我实际想要做的一个很好的简化,但我已经有其他问题,所以我&#39 ;我正在寻找一般解决方案。

基本上我有三个功能,并希望一些元素在这三个中都有默认值。这些函数在彼此之间调用,但有时会单独调用(即foo1调用foo2foo2调用foo3,但有时我只调用foo3foo2)。

编辑澄清:我正在寻找一种方法来传递wd(并且在我的实际问题中)从被调用的函数级别传递一些其他变量,而不必在每个函数中将它们写出来呼叫。那就是我想在所有级别设置默认wd。为了避免将所有不同的东西命名为混乱,如果你想单独调用函数,我在每个函数调用中尝试使用wd = wd(旨在从它正在调用的函数中访问wd。给出promise already under evaluation: recursive default argument reference or earlier problems?。有没有更好的方法来传递参数,以便在另一个函数中调用它时传递参数?

我的第一个示例工作显示了工作代码,但每次我调用其中的其他函数时,我必须指定wd = wd,当它是多个参数时,我多次调用函数/在ddply内使脚本很麻烦。

第二个例子是我所希望的,其中wd默认设置为wd在它被调用的环境中,但显然不允许发生错误。传递参数的最佳方法是什么,而不必不断分配?

编辑:我查看了promise already under evaluation: recursive default argument reference or earlier problems?的答案,我知道这是一种可能的解决方法(我目前正在运行脚本),但我真的希望得到每个函数的参数都有相同的名称,这样当它们被单独调用时,可以快速方便地记住参数名称。

示例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 :(得分:0)

我认为您不应该尝试在不同的环境中重复使用相同的名称。在promise already under evaluation: recursive default argument reference or earlier problems?建立可能重复的问题以及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)
}