Matlab积分模拟代码转R遇NA错误及嵌套函数实现疑问
解决你的R代码报错与嵌套函数实现问题
一、先修复代码报错问题
你遇到的NA错误主要来自两个关键问题:
- 错误使用
evaluate函数:R里不需要用evaluate来调用自定义函数,直接把向量传入函数即可——R的函数天然支持向量化运算,会自动处理整个向量的每个元素。 - 调用
func8时参数不全:你的func8需要两个输入参数,但你只传了一个,导致计算逻辑断裂。
修正后的基础版本代码如下:
# 定义子函数 func3 <- function(x) { exp(exp(x)) } func8 <- function(x, y) { exp((x + y)^2) } # 主函数 f <- function() { numSim <- 1000000 points <- runif(numSim) # 直接调用func3,无需额外的evaluate函数 r3 <- mean(func3(points)) points1 <- runif(numSim) # 给func8传入两个所需的随机向量参数 r8 <- mean(func8(points, points1)) return(list(r3 = r3, r8 = r8)) } # 运行测试 result <- f() print(result)
这段代码会正常输出两个积分的近似值,不会再出现NA的问题。
二、在R中实现类似Matlab的嵌套函数
Matlab里的嵌套函数是在主函数内部定义子函数,R里完全可以复刻这个逻辑——直接把子函数定义在主函数的内部即可,这样子函数只能在主函数内部被调用,外部无法直接访问,和Matlab的嵌套函数效果一致。
嵌套版本的代码如下:
f <- function() { numSim <- 1000000 # 嵌套定义func3,仅在f函数内部可见 func3 <- function(x) { exp(exp(x)) } # 嵌套定义func8,仅在f函数内部可见 func8 <- function(x, y) { exp((x + y)^2) } points <- runif(numSim) r3 <- mean(func3(points)) points1 <- runif(numSim) r8 <- mean(func8(points, points1)) return(list(r3 = r3, r8 = r8)) } # 运行测试 result <- f() print(result)
额外提个小技巧:R里的函数不需要显式写return()(除非你需要提前返回结果),函数最后一行的运算结果会自动作为返回值,所以上面的子函数可以去掉return语句,让代码更简洁。
内容的提问来源于stack exchange,提问作者user9802913
相关产品推荐
相关产品推荐

