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加载
如果你想把函数保存成文件复用:
- 把函数代码复制到文本编辑器(比如Notepad、RStudio新建脚本),保存为
SPM.R(必须带.R后缀)。 - 用
getwd()查看R当前的工作目录,用setwd("你的文件所在文件夹路径")切换到脚本所在目录。 - 运行
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) }
主要修改点说明
replicate的正确用法:原代码里replicate(N, function(bilhetes) {...})是错误的,replicate的第二个参数应该是要执行的表达式/函数调用,不是函数定义。我把单次模拟逻辑封装成single_simulation,再用replicate重复调用。- 避免变量污染:原代码里
ganho和奖池数据是全局定义的,会导致多次模拟之间互相影响。现在每次模拟都会重新初始化这些变量,保证每次模拟都是独立的。 - 简化奖项更新逻辑:原代码一堆
else if判断奖项的写法太繁琐,改成用which(premios == A)直接定位奖项索引,代码更简洁易维护。 - 符合实际抽奖规则:把
sample的replace = T改成replace = FALSE,模拟彩票不放回的真实场景。
三、测试修复后的函数
现在你可以先运行修复后的函数代码,然后调用测试:
# 运行模拟 result <- SPM(bilhetes = 5, N = 100) # 查看收益的统计信息 summary(result) # 绘制收益分布直方图 hist(result, main = "彩票模拟收益分布", xlab = "单次5张票的收益")
这样就能得到N次模拟的收益结果啦。
内容的提问来源于stack exchange,提问作者Filipe Pereira
相关产品推荐
相关产品推荐

