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

如何对数据框列应用多参数自定义函数?解决函数未找到报错

解决sapply调用自定义函数时的"object not found"错误

你遇到的这个报错,核心原因有两个:一是你的GJNeeded函数没写完,R没法识别它;二是后续调用sapply时参数对应可能会错位,我一步步帮你解决:

1. 先补全你的自定义函数

从你贴的代码看,GJNeeded的定义写到Temp_G...就中断了,R无法识别一个不完整的函数对象,所以会报找不到它的错误。我先帮你补全一个符合参数逻辑的函数(假设是计算所需能量的公式,你可以根据实际需求修改计算逻辑):

GJNeeded = function(SqFt, RValue, temp_outside, Temp_Grow) {
  # 示例计算逻辑,你可以替换成自己的公式
  (SqFt * (Temp_Grow - temp_outside)) / (RValue * 1000)
}

一定要确保函数的括号、参数、函数体都完整,这样R才能把它当成有效的函数。

2. 修正sapply的调用方式

sapply有个默认规则:它会把X里的每个元素,作为FUN的第一个位置参数传进去。而你原来的函数第一个参数是固定值SqFt,直接调用会导致参数错位,这里有两种解决办法:

方法一:调整函数参数顺序

把可变的temp_outside(也就是df$Temp的元素)放在函数的第一个参数位置,这样sapply就能自动对应上:

# 调整参数顺序,把temp_outside放在第一位
GJNeeded = function(temp_outside, SqFt, RValue, Temp_Grow) {
  (SqFt * (Temp_Grow - temp_outside)) / (RValue * 1000)
}

# 直接调用sapply,后面的参数固定传递
result <- sapply(X = df$Temp, FUN = GJNeeded, SqFt = 212265, RValue = 2, Temp_Grow = 14)
print(result)

方法二:用匿名函数包装(不调整原函数)

如果你不想改原函数的参数顺序,就用匿名函数明确把df$Temp的元素传给temp_outside参数:

# 保持原参数顺序的函数
GJNeeded = function(SqFt, RValue, temp_outside, Temp_Grow) {
  (SqFt * (Temp_Grow - temp_outside)) / (RValue * 1000)
}

# 用匿名函数指定参数对应关系
result <- sapply(X = df$Temp, FUN = function(x) {
  GJNeeded(SqFt = 212265, RValue = 2, temp_outside = x, Temp_Grow = 14)
})
print(result)

3. 完整可运行代码

把所有代码整合起来测试,就不会再报错了:

# 构造数据框
Temp = c(2, 3, 5)
s = c("aa", "bb", "cc")
b = c(TRUE, FALSE, TRUE)
df = data.frame(s, b, Temp)

# 定义完整函数(这里用方法一的参数顺序)
GJNeeded = function(temp_outside, SqFt, RValue, Temp_Grow) {
  (SqFt * (Temp_Grow - temp_outside)) / (RValue * 1000)
}

# 调用sapply并输出结果
result <- sapply(X = df$Temp, FUN = GJNeeded, SqFt = 212265, RValue = 2, Temp_Grow = 14)
print(result)

最后再提醒两个关键点:

  • 自定义函数必须完全定义,不能有语法残缺;
  • 用sapply传递参数时,一定要注意X的元素和FUN参数的对应关系,避免错位。

内容的提问来源于stack exchange,提问作者user2946746

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:01:43