R3.3.2调用自定义绘图函数触发无限递归错误求因
问题原因:无限递归导致的嵌套过深错误
嘿,这个问题我太熟悉了!你遇到的核心问题是自定义函数名和R内置函数重名,直接触发了无限递归:
你把自己的函数命名为plot,但R本身就有一个负责基础绘图的内置函数plot()。当你在自定义函数内部写plot(model)时,R会优先调用你自己定义的这个plot函数,而不是系统内置的版本——这就形成了一个死循环:函数不断调用自己,一层嵌套一层,直到超出R允许的表达式嵌套上限,就抛出了Error: evaluation nested too deeply: infinite recursion / options(expressions=)?这个错误。
而你未封装成函数时,直接调用plot(model)用的是内置的plot(),自然不会有问题。
解决方案
有两种简单的修复方式:
方案1:修改自定义函数名称(推荐)
直接给你的函数换一个不会和内置函数冲突的名字,比如plot_model_diagnostics:
x=rnorm(1000)+sin(c(1:1000)/100)#random data+ sinus superimposed plot_model_diagnostics <- function(model){ par(mfrow=c(2,2))# plot window settings plot(model) # 现在这里会正常调用内置的plot()函数 lines(filter(model,rep(1/30,30)),col='red') plot(filter(model,rep(1/30,30))) # 补充你未完成的代码部分 }
方案2:明确指定调用内置plot函数
如果你一定要保留plot作为函数名,可以在内部调用时指定使用graphics包(内置plot所在的包)的版本:
x=rnorm(1000)+sin(c(1:1000)/100)#random data+ sinus superimposed plot <- function(model){ par(mfrow=c(2,2))# plot window settings graphics::plot(model) # 明确调用系统内置的plot函数 lines(filter(model,rep(1/30,30)),col='red') graphics::plot(filter(model,rep(1/30,30))) # 补充你未完成的代码部分 }
小提醒
在R里尽量避免用内置函数名(比如c、mean、sum、plot)或者常用包的函数名作为自定义对象/函数的名字,不然很容易出现这类覆盖、递归的问题,排查起来还很头疼~
内容的提问来源于stack exchange,提问作者scriptgirl_3000
相关产品推荐
相关产品推荐

