R语言中如何在自定义函数内调用pgls与sma函数?
问题原因
你遇到的错误核心是公式未能正确解析传入的列名。当你将sym('Long')这类符号对象传入函数后,函数内部的公式会直接把P1和P2当作字面量对象,而非从dataf中提取对应的列数据,导致log()接收到非数值参数,或sma无法识别有效数据列。
解决方案
方法1:字符串动态构建公式(新手友好)
直接将列名以字符串形式传入,拼接成公式字符串后转换为公式对象:
修正后的getpgls函数
getpgls <- function(P1, P2, dataf){ # 拼接含log转换的公式字符串 formula_str <- paste0("log(", P1, ") ~ log(", P2, ")") # 转换为公式并调用pgls PGLSt <- pgls(as.formula(formula_str), data = dataf, lambda = 'ML') return(PGLSt) }
调用示例:
result_pgls <- getpgls("Long", "massAvg", CompData)
修正后的getsma函数
getsma <- function(P1, P2, dataf){ formula_str <- paste0(P1, " ~ ", P2) SMAt <- sma(as.formula(formula_str), log = "xy", data = dataf) return(SMAt) }
调用示例:
result_sma <- getsma("Long", "massAvg", Data_Animal_de_pd)
方法2:rlang准引用(进阶简洁写法)
若习惯用sym()传递列名,可利用rlang包的准引用语法(!!)在公式中解引用符号对象:
修正后的getpgls函数
library(rlang) getpgls <- function(P1, P2, dataf){ PGLSt <- pgls(log(!!P1) ~ log(!!P2), data = dataf, lambda = 'ML') return(PGLSt) }
调用示例:
result_pgls <- getpgls(sym('Long'), sym('massAvg'), CompData)
修正后的getsma函数
library(rlang) getsma <- function(P1, P2, dataf){ SMAt <- sma(!!P1 ~ !!P2, log = "xy", data = dataf) return(SMAt) }
调用示例:
result_sma <- getsma(sym('Long'), sym('massAvg'), Data_Animal_de_pd)
验证说明
使用你提供的测试数据,两种方法均可正常运行,得到与直接调用pgls/sma完全一致的结果。
内容的提问来源于stack exchange,提问作者Kale M.F
相关产品推荐
相关产品推荐

