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

如何在自定义R函数中使用which.min求最小值并修复报错

问题分析与代码修正

先梳理原代码的核心错误:

  • 函数名不匹配:定义的是simulation.model,调用时却写了new.simulation.function
  • 未定义变量:dataset、insert.dataset都是无定义的,要统一使用函数参数import.dataset
  • 抽样逻辑错误:原数据集只有8个值,无放回抽取1000次直接报错,得改成有放回抽样,或者生成数据集外的实数候选值
  • 循环语法错误:for循环没加{}包裹代码块,导致只有第一行属于循环逻辑,其余代码都在循环外执行
  • 平方差均值计算逻辑完全错误,没有对应到每个候选值的计算逻辑

修正后的代码(候选值来自原数据集有放回抽样)

Dataset1 <- c(12739, 172392, 16477, 14738, 12223, 15473, 18999, 12278)

simulation.model <- function(import.dataset, candidate_num = 1000){ 
  # 从原数据集有放回抽取1000个候选值
  candidates <- sample(import.dataset, size = candidate_num, replace = TRUE)
  # 计算每个候选值对应的平方差平均值
  mean_sq_diff <- sapply(candidates, function(x) {
    mean((x - import.dataset)^2)
  })
  # 用which.min找到最小平均值的位置,再取出对应候选值
  best_candidate <- candidates[which.min(mean_sq_diff)]
  
  return(list(chosen_candidate = best_candidate, 
              min_mean_sq_diff = min(mean_sq_diff)))
}

# 调用函数
simulation.model(Dataset1)

扩展:候选值来自任意实数范围

如果需要候选值不局限于原数据集,比如在原数据的最小-最大值区间生成随机实数:

simulation.model_extended <- function(import.dataset, candidate_num = 1000){ 
  # 生成原数据范围内的随机实数候选值
  min_val <- min(import.dataset)
  max_val <- max(import.dataset)
  candidates <- runif(candidate_num, min = min_val, max = max_val)
  # 计算每个候选值的平方差均值
  mean_sq_diff <- sapply(candidates, function(x) {
    mean((x - import.dataset)^2)
  })
  # 用which.min定位最小值的索引位置
  best_idx <- which.min(mean_sq_diff)
  best_candidate <- candidates[best_idx]
  
  return(list(chosen_candidate = best_candidate, 
              min_mean_sq_diff = mean_sq_diff[best_idx]))
}

simulation.model_extended(Dataset1)

关于which.min的用法说明

  • which.min(mean_sq_diff)会返回mean_sq_diff向量中最小值所在的索引位置
  • 拿到索引后,直接用candidates[索引]就能取出对应的候选值
  • 注意:如果有多个候选值对应相同的最小平均值,which.min只会返回第一个出现的索引

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:20:52