R - 在另一个函数内的函数中定义一个对象

时间:2018-01-25 16:28:27

标签: r function parameter-passing

我在另一个函数中有一个这样的函数:

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之前不会定义它。有没有解决这个问题?

3 个答案:

答案 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变量,它们也保持不变。