![](/img/trans.png)
[英]Is it possible to define a function as an argument of another function in 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.