如何在自定义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
相关产品推荐
相关产品推荐

