如何对数据框列应用多参数自定义函数?解决函数未找到报错
解决
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
相关产品推荐
相关产品推荐

