R语言内部函数变量问题排查及调用方式咨询
R语言嵌套函数运行机制问题解答
一、"R object n is not found"错误原因
你的代码存在两个关键问题:
n从未被创建:n是func2内部定义的变量,但你执行func1(a=1,b=2)()时,实际调用的是func1返回的func3,而func2全程没被执行过,n自然不存在。- 函数作用域隔离:就算调用了
func2,n也是func2的局部变量,属于func2的专属作用域,func3无法直接访问——R中每个函数都有独立的作用域,内部函数只能访问父环境(这里是func1的环境)的变量,不能访问同级其他函数的局部变量。
如果要让func3能用到l*m的结果,有两种常见修改方式:
- 把计算逻辑移到
func1环境中,让n成为func1的变量:func1 <- function(a, b) { l <- a * 10 m <- b * 20 n <- l * m func3 <- function() { o <- n/2 o } } - 让
func2返回计算结果,再在func3里调用func2()获取值:func1 <- function(a, b) { l <- a * 10 m <- b * 20 func2 <- function() { l * m } func3 <- function() { n <- func2() o <- n/2 o } }
修改后执行func1(1,2)()就能得到正确结果200。
二、关于函数调用方式的问题
func1(a=2,b=2)()不是唯一调用方式,直接用func1(a=2,b=2)无法执行核心逻辑的原因是:
func1的返回值是func3这个函数对象,而非func3执行后的计算结果。直接调用func1(a=2,b=2)只是得到这个函数对象,不会触发内部计算。
你还可以用这些方式调用:
- 先把返回的函数存到变量,再调用:
my_func <- func1(a=2, b=2) my_func() - 修改
func1,让它主动调用func3并返回结果,这样就能直接用func1(a=2,b=2)调用:func1 <- function(a, b) { l <- a * 10 m <- b * 20 func2 <- function() { l * m } func3 <- function() { n <- func2() o <- n/2 o } func3() }
此时执行func1(a=2,b=2)就能直接得到结果400。
内容的提问来源于stack exchange,提问作者trailblazer_1
相关产品推荐
相关产品推荐

