R语言levelplot中如何自定义panel.2dsmoother内loess拟合参数
解决方案
不要把loess的参数拼接在method的字符串值里,panel.2dsmoother会自动把自身不识别的命名参数透传给指定的平滑方法函数,直接把span、degree等loess参数写在panel.2dsmoother()的调用参数中即可,修改后的代码如下:
levelplot(chla_avg ~ lat * depth, trunc_level_test, ylim = c(275, 5), region = TRUE, col.regions = hcl.colors(110, palette = "spectral",rev=F), contour = FALSE, cuts = 100, panel = panel.levelplot.points) + layer_(panel.2dsmoother(..., n = 400, method = 'loess', span = 0.1, degree = 1))
这个传参逻辑和官方文档描述完全一致:函数内部调用平滑模型的格式为
method(form, data = list(x=x, y=y, z=z), {args}),其中{args}就是你传入的、不属于panel.2dsmoother自身正式参数的其他命名参数,会被自动传入模型函数中。
如果你需要配置更复杂的loess规则,也可以先自定义一个预设置参数的包装函数,再传给method参数:
# 预定义带固定参数的loess拟合函数 my_loess <- function(form, data, ...) { loess(form, data = data, span = 0.1, degree = 1, family = "gaussian", ...) } # 调用时直接传入自定义函数 levelplot(chla_avg ~ lat * depth, trunc_level_test, ylim = c(275, 5), region = TRUE, col.regions = hcl.colors(110, palette = "spectral",rev=F), contour = FALSE, cuts = 100, panel = panel.levelplot.points) + layer_(panel.2dsmoother(..., n = 400, method = my_loess))
- 直接透传参数的写法最简便,适合仅调整少数几个loess参数的场景
- 自定义包装函数的写法灵活性更高,适合需要传入多组复杂参数、甚至添加前置数据处理逻辑的场景
之前报错的核心原因是:你传入的'loess(span=0.1)'会被R识别为完整的函数名,当前环境中不存在这个名称的函数,自然会抛出「could not find function」的错误。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

