在R语言中如何将一个函数的输出传递给另一个函数
报错原因
R 默认采用词法作用域规则,函数内部创建的变量属于局部变量,仅在函数内部环境中可访问,不会泄露到父级调用环境中。你当前的代码存在两个核心问题:
func1没有显式返回你需要的k、j、i三个变量,默认只会返回最后一行代码的计算结果也就是i的值func2直接尝试访问func1内部的局部变量k、j、i,会触发「对象未找到」的报错
解决方案
方案1(推荐):显式返回需要的变量
通过列表返回func1的所有计算结果,在func2中接收后再做计算,不会污染全局环境,是最规范的写法:
func1 <- function(x, y, z) { k = x*2 j = y*2 i = z*2 # 用列表封装所有需要返回的变量 return(list(k = k, j = j, i = i)) } func2 <- function(x, y, z) { # 接收func1返回的计算结果 res_func1 <- func1(x, y, z) m = res_func1$k * res_func1$j * res_func1$i return (m) } # 测试:输入1、2、3,预期输出为(2)*(4)*(6)=48 func2(1,2,3)
方案2(不推荐):调整变量作用域
如果确实需要直接通过变量名访问,可以在func1中使用超赋值符<<-将变量写入父级环境,用完后建议手动清理避免环境污染:
func1 <- function(x, y, z) { k <<- x*2 j <<- y*2 i <<- z*2 } func2 <- function(x, y, z) { func1(x, y, z) m = k * j * i # 手动清理写入全局环境的变量 rm(k,j,i,envir = .GlobalEnv) return (m) }
注意:超赋值符会修改全局环境变量,可能和其他代码的变量冲突,非特殊场景不要使用。
内容的提问来源于stack exchange,提问作者Amir Valizadeh
相关产品推荐
相关产品推荐

