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

R语言自定义SPM函数执行报错:无法找到函数及source失败求助

解决你的R函数问题:从加载错误到逻辑修复

一、先搞定"找不到SPM函数"和source报错的问题

你遇到的第一个报错could not find function "SPM",核心原因是函数还没被加载到当前R环境里;而source("SPM")报错是因为source()需要的是带后缀的R脚本文件路径,不是函数名。这里给你两种简单的加载方法:

方法1:直接运行函数代码

把你写的SPM <- function(...) {...}这段完整代码,直接复制粘贴到R控制台按回车,或者在RStudio里选中全部代码点击运行按钮。运行完成后,函数就会被定义到当前环境,之后就能直接调用SPM(bilhetes = 5, N = 100)了。

方法2:正确使用source加载

如果你想把函数保存成文件复用:

  1. 把函数代码复制到文本编辑器(比如Notepad、RStudio新建脚本),保存为SPM.R(必须带.R后缀)。
  2. 用getwd()查看R当前的工作目录,用setwd("你的文件所在文件夹路径")切换到脚本所在目录。
  3. 运行source("SPM.R"),就能成功加载函数了。

二、修复SPM函数本身的逻辑错误

就算加载成功,原代码还有几个逻辑问题会导致运行出错,比如replicate用法错误、变量污染等。我帮你整理了修复后的代码,同时解释修改点:

修复后的完整代码

SPM <- function(bilhetes, N){
  total_bilhetes <- 12012000
  premios <- c(0,5,10,15,20,25,50,100,300,1000,27000,108000,288000)
  premios_bilhetes <- c(8485550,1895000,496800*2,88800*3,55200*4,16800*4,7920*6,5030*6,950*5,950,30,10,10)
  
  # 封装单次模拟的逻辑
  single_simulation <- function(bilhetes) {
    # 每次模拟重新初始化奖池,避免不同模拟互相干扰
    current_prizes <- premios_bilhetes
    current_total <- total_bilhetes
    ganho <- 0
    
    for (i in 1:bilhetes) {
      # 计算当前剩余奖项的概率
      probs <- current_prizes / current_total
      # 不放回抽取奖项(符合彩票实际规则)
      A <- sample(x = premios, replace = FALSE, size = 1, prob = probs)
      # 计算收益:每张票成本5,加上中奖金额
      ganho <- ganho - 5 + A
      
      # 找到对应奖项的索引,更新剩余数量
      prize_idx <- which(premios == A)
      current_prizes[prize_idx] <- current_prizes[prize_idx] - 1
      # 更新总剩余票数
      current_total <- current_total - 1
    }
    return(ganho)
  }
  
  # 用replicate重复N次模拟,收集结果
  vector_ganhos <- replicate(N, single_simulation(bilhetes))
  return(vector_ganhos)
}

主要修改点说明

  1. replicate的正确用法:原代码里replicate(N, function(bilhetes) {...})是错误的,replicate的第二个参数应该是要执行的表达式/函数调用,不是函数定义。我把单次模拟逻辑封装成single_simulation,再用replicate重复调用。
  2. 避免变量污染:原代码里ganho和奖池数据是全局定义的,会导致多次模拟之间互相影响。现在每次模拟都会重新初始化这些变量,保证每次模拟都是独立的。
  3. 简化奖项更新逻辑:原代码一堆else if判断奖项的写法太繁琐,改成用which(premios == A)直接定位奖项索引,代码更简洁易维护。
  4. 符合实际抽奖规则:把sample的replace = T改成replace = FALSE,模拟彩票不放回的真实场景。

三、测试修复后的函数

现在你可以先运行修复后的函数代码,然后调用测试:

# 运行模拟
result <- SPM(bilhetes = 5, N = 100)
# 查看收益的统计信息
summary(result)
# 绘制收益分布直方图
hist(result, main = "彩票模拟收益分布", xlab = "单次5张票的收益")

这样就能得到N次模拟的收益结果啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:45:13