You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:10:56