使用R语言mapply运行函数时输出不符合预期的问题排查
问题根源:mapply的参数传递方式不对
你遇到的问题核心是mapply会自动拆分传入的向量参数,按元素一一对应传递给函数。你的input.rows3的列都是长度5的向量,但P是长度1000的向量,mapply会循环重复input.rows3的5行数据,来匹配P的1000个元素,导致函数被调用了1000次,最终得到1000行结果。而你真正想要的是:对input.rows3的每一行(共5行),都传入完整的P向量来计算最优值。
两种解决思路
思路1:使用MoreArgs传递完整的P向量(推荐,最贴合你的原有代码)
mapply提供了MoreArgs参数,用于指定不需要被拆分的参数——这些参数会完整传递给每一次函数调用。修改你的results3调用代码如下:
results3 <- as.data.frame(t(mapply(marg.N.resp.function3, input.rows3$va, input.rows3$co, input.rows3$pd, input.rows3$Cl, MoreArgs = list(P = P))))
这样mapply只会循环input.rows3的5行数据,每次调用函数时都传入完整的1000个元素的P向量,最终得到5行的结果。
思路2:改用apply遍历行(更直观的行遍历方式)
如果你觉得mapply的参数传递容易混淆,可以改用apply按行遍历input.rows3,每次把当前行的参数和完整的P传入函数:
# 按行遍历input.rows3,每行调用一次函数 output_list <- apply(input.rows3, 1, function(row) { marg.N.resp.function3(va = row["va"], co = row["co"], pd = row["pd"], Cl = row["Cl"], P = P) }) # 把列表转成dataframe results3 <- as.data.frame(t(output_list))
额外优化:让返回的resultP更整洁
你的函数中resultP返回的是一个dataframe,这会导致最终的results3最后一列是列表类型。可以把resultP改成提取单个数值(用pull()代替select()):
resultP <- cbind(optimalP,P) %>% slice(which.min(diff)) %>% pull(P)
这样返回的是单个数值,最终的results3所有列都是数值类型,更符合预期。
验证修改后的结果
修改后运行代码,你会得到一个5行5列的dataframe,最后一列就是每行对应的最优P值,和你的预期一致。
内容的提问来源于stack exchange,提问作者Giuseppe Petri
相关产品推荐
相关产品推荐

