簡體   English   中英

R-在另一個函數內部的函數中定義對象

[英]R - Define a object in a function which is inside another function

我在另一個內部有一個這樣的功能:

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中的錯誤: Error in func2(2) : object 'ko' not found 基本上我想在func2使用對象ko ,直到調用func3才定義它。 有沒有解決辦法?

是的,可以解決:

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

當前,您實際上並沒有在另一個函數“內部”擁有一個函數(您只是在另一個函數中調用一個函數)。 如果您確實將一個功能移到了另一個功能內,則可以使用

func3 <- function(l=1) {
  func2 <- function(x=1) {ko+x+1}
  ko <- 2
  func2(2)+l
}
func3(1)

函數保留有關定義它們的環境的信息。 這稱為“詞法作用域”,這是R的工作方式。

但是總的來說,我同意@Roland的觀點,寫具有顯式參數的函數更好。

這是學習閉包和使用工廠的好案例。

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變量,它們也保持不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM