求助:R语言自定义函数输出不随输入变更的原因排查
R语言自定义函数输出不随参数变化的原因及修复方案
问题根源:运算优先级错误导致关键项失效
你函数里的(1.60217662E-19^2)写法犯了运算优先级错误:在R中,^的优先级高于科学计数法的负号,所以实际计算的是1.60217662 * 10^(-19^2)——也就是1.60217662 × 10^-361,这是一个趋近于0的极小值。
这个极小值乘以后续包含sw、r、delta的项后,结果仍然几乎为0,导致第二个exp()的参数近似为0,exp(0)=1。最终整个函数的结果固定为exp(0.05795) - 1,自然不会随输入参数变化。
修复方法:修正运算优先级
把(1.60217662E-19^2)改成((1.60217662E-19)^2),确保先计算电子电荷的平方,再参与后续运算。同时建议给分母部分加上括号,让公式逻辑更清晰:
response <- function(sw, r, delta) { exp(0.05795) * exp( ((1.60217662E-19)^2) / (8 * pi * 298 * 1.381E-23 * 8.854E-12) * (1/sw*((1/r)-(1/(r+delta+0.008399)))-1/2.2*(1/r-1/(r+delta))) ) - 1 }
验证修复效果
修改后调用不同参数,输出结果会随输入变化:
# 测试参数1,1,1 value1 <- response(1,1,1) format(value1, nsmall = 20) # 测试参数2,2,2 value2 <- response(2,2,2) format(value2, nsmall = 20)
此时两个结果不再相同,符合参数驱动计算的预期,也能和Excel的计算结果对齐。
内容的提问来源于stack exchange,提问作者Annie Shan
相关产品推荐
相关产品推荐

