R语言函数内对象无法保存求助:控制台正常函数内失效
问题分析与解决方案
这其实是R的作用域规则导致的问题,和调试器退出关系不大哦~
核心原因:局部变量 vs 全局变量
在R里,函数内部创建的变量(比如你的monkey)默认是局部变量,只在函数运行的临时环境里存在,函数执行完毕后这个环境就被销毁了,所以全局环境里自然看不到这个对象。而你在控制台直接运行Monkey <- 0是在全局环境创建变量,所以能保留下来。
解决方法
有两种常见的方式能让函数运行后得到你需要的结果:
1. 推荐方式:用return()返回结果
这是R函数的标准写法,清晰且符合最佳实践:
corr <- function(directory, threshold=0) { directory <- paste(getwd(),"/",directory,"/",sep="") file.list <- list.files(directory) number <- 1:length(file.list) monkey <- c() for (i in number) { x <- paste(directory,file.list[i],sep="") y <- read.csv(x) t <- sum(complete.cases(y)) if (t >= threshold) { correl <- cor(y$sulfate, y$nitrate, use='pairwise.complete.obs') monkey <- append(monkey,correl) } } return(monkey) # 这里添加返回语句 } # 调用函数并把结果赋值给全局变量 monkey <- corr('specdata', 150) monkey # 现在就能看到结果了
2. 不推荐:用<<-强制赋值到全局环境
这种方式会直接修改全局环境的变量,虽然能解决问题,但容易导致环境混乱,不建议在正式代码里使用:
corr <- function(directory, threshold=0) { directory <- paste(getwd(),"/",directory,"/",sep="") file.list <- list.files(directory) number <- 1:length(file.list) monkey <<- c() # 用<<-创建全局变量 for (i in number) { x <- paste(directory,file.list[i],sep="") y <- read.csv(x) t <- sum(complete.cases(y)) if (t >= threshold) { correl <- cor(y$sulfate, y$nitrate, use='pairwise.complete.obs') monkey <<- append(monkey,correl) # 用<<-更新全局变量 } } } corr('specdata', 150) monkey # 现在能看到结果
关于调试器的疑问
你提到误触调试器退出后出现问题,其实调试器一般只会影响函数运行时的临时环境,不会改变R的作用域规则。大概率是你之前没注意到函数局部变量的特性,刚好在调试后发现这个问题,两者只是时间上的巧合~
内容的提问来源于stack exchange,提问作者RichardMillington
相关产品推荐
相关产品推荐

