我在另一个函数中有一个这样的函数:
func2 <- function(x=1) {ko+x+1}
func3= function(l=1){
ko=2
func2(2)+l
}
func3(1)
它显示错误:Error in func2(2) : object 'ko' not found
。基本上我想在ko
中使用对象func2
,在调用func3
之前不会定义它。有没有解决这个问题?
答案 0 :(得分:4)
是的,可以修复:
func2 <- function(x=1) {ko+x+1}
func3= function(l=1){
ko=2
assign("ko", ko, environment(func2))
res <- func2(2)+l
rm("ko", envir = environment(func2))
res
}
func3(1)
#[1] 6
如你所见,这非常复杂。这通常表明你没有遵循良好的做法。好的做法是将ko
作为参数传递:
func2 <- function(x=1, ko) {ko+x+1}
func3= function(l=1){
ko=2
func2(2, ko)+l
}
func3(1)
#[1] 6
答案 1 :(得分:3)
你当前没有一个“内部”功能(你只是在一个不同的功能中调用一个功能)。如果你确实在另一个函数中移动了一个函数,那么这将起作用
func3 <- function(l=1) {
func2 <- function(x=1) {ko+x+1}
ko <- 2
func2(2)+l
}
func3(1)
函数保留有关定义它们的环境的信息。这被称为“词汇范围”,它就是R的运作方式。
但总的来说,我同意@Roland认为编写具有明确参数的函数更好。
答案 2 :(得分:0)
这是学习闭包和使用工厂的好例子。
func3_factory <- function (y) {
ko <- y
func2 <- function (x = 1) { ko + x + 1 }
function (l = 1) { func2(2) + l }
}
ko <- 1
func3_ko_1 <- func3_factory(ko)
ko <- 7
func3_ko_7 <- func3_factory(ko)
# each function stores its own value for ko
func3_ko_1(1) # 5
func3_ko_7(1) # 11
# changing ko in the global scope doesn't affect the internal ko values in the closures
ko <- 100
func3_ko_1(1) # 5
func3_ko_7(1) # 11
当func3_factory
返回一个函数时,该新函数与创建它的环境相结合,在这种情况下,它包含一个名为ko
的变量,该变量保存传递给工厂的任何值,一个名为func2
的函数,它还可以访问ko
的固定值。函数的组合和它所定义的环境被称为闭包。返回函数中发生的任何事情都可以访问这些值,即使在闭包之外更改ko
变量,它们也保持不变。