如何在函数中正确使用subset?函数内调用报错问题排查
问题:函数内执行
subset后,外部无法访问临时变量? 在外部直接用subset筛选数据并求和能正常得到结果,但把相同逻辑封装到函数里后,执行函数再访问tmp_output会提示“object 'tmp_output' not found”,误以为是subset在函数里有兼容性问题,实际是变量作用域的问题。
报错代码(函数内)
library(dplyr) my_function <- function(a, b, c) { tmp_output <- subset(my_df, vector1 == a & vector2 == b & vector3 == c, select=column1) %>% sum } my_function("spec1", "temp2", 300) tmp_output # Error: object 'tmp_output' not found
正常运行代码(外部)
tmp_output <- subset(my_df, vector1 == "spec1" & vector2 == "temp2" & vector3 == 300, select=column1) %>% sum tmp_output #[1] 0
测试数据
my_df <- data.frame( vector1=c(rep("spec1", 6), rep("spec2", 6)), vector2=c(rep("temp1", 6), rep("temp2", 6)), vector3=c(rep(300, 6), rep(500, 6)), column1=c(rep(2, 4), rep(5, 4), rep(11, 4)) )
问题原因
函数内部创建的tmp_output是局部变量,仅在函数的执行环境中存在,函数执行完毕后局部环境销毁,外部的全局环境根本找不到这个变量,和subset本身没有兼容性问题。
解决方案
方案1:让函数返回计算结果(推荐)
修改函数,让它返回求和结果,外部用变量接收即可:
library(dplyr) my_function <- function(a, b, c) { # 直接返回计算结果,不需要局部变量 subset(my_df, vector1 == a & vector2 == b & vector3 == c, select=column1) %>% sum } # 外部接收返回值 tmp_output <- my_function("spec1", "temp2", 300) tmp_output #[1] 0
方案2:将变量设为全局变量(不推荐)
可以用<<-把局部变量赋值到全局环境,但这种写法会污染全局命名空间,容易引发变量冲突,不建议使用:
library(dplyr) my_function <- function(a, b, c) { # 用<<-赋值到全局环境 tmp_output <<- subset(my_df, vector1 == a & vector2 == b & vector3 == c, select=column1) %>% sum } my_function("spec1", "temp2", 300) tmp_output #[1] 0
内容的提问来源于stack exchange,提问作者Jacqueline
相关产品推荐
相关产品推荐

