我有一个关于通过R中的嵌套函数传递默认参数的一般性问题。我的例子(显然)是我实际想要做的一个很好的简化,但我已经有其他问题,所以我&#39 ;我正在寻找一般解决方案。
基本上我有三个功能,并希望一些元素在这三个中都有默认值。这些函数在彼此之间调用,但有时会单独调用(即foo1
调用foo2
和foo2
调用foo3
,但有时我只调用foo3
或foo2
)。
编辑澄清:我正在寻找一种方法来传递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?
答案 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)
}