为什么plot(Vectorize(f))可正常运行但curve(Vectorize(f))会报错?
R中
plot和curve处理函数输入的行为差异原因 核心原因:两个函数的参数求值逻辑设计不同
1. plot能正常接收Vectorize(f)的原因
当你给plot传入函数对象时,R会调度plot.function这个S3方法执行,该方法对第一个输入参数采用标准求值逻辑:会直接对传入的Vectorize(cor_p_value)执行求值,拿到返回的函数对象后直接调用,因此运行正常。
2. curve直接传入Vectorize(f)报错的原因
curve的第一个参数expr的设计支持两种输入模式:
- 模式1:传入合法的函数对象
- 模式2:传入包含变量
x的表达式(例如curve(x^2 + 2*x, xlim = c(0, 10))这种便捷写法)
为了支持表达式模式,curve对第一个参数采用非标准求值(NSE)逻辑:会先解析传入的表达式语法,而非直接对输入做求值。你直接写Vectorize(lm_F_p_value)时,curve的内部校验逻辑不会先执行Vectorize调用得到函数对象,只会把它当作普通表达式检查是否包含x变量,校验不通过就抛出你遇到的错误。
补充解决方案
除了你使用的提前赋值的方案外,还可以给参数加外层括号强制R先对括号内的内容求值,无需额外定义临时变量:
curve((Vectorize(lm_F_p_value)), col = "red", lwd = 3, lty = 2, add = TRUE)
该差异是否属于Bug?
不属于Bug,是两个函数的定位不同导致的设计差异:plot.function是专门用于函数可视化的方法,优先保证函数输入的兼容性;curve的设计优先兼顾表达式绘图的便捷性,才引入了非标准求值的逻辑,二者行为不一致是刻意设计的结果。
内容的提问来源于stack exchange,提问作者Tomas
相关产品推荐
相关产品推荐

