R语言函数返回值跨函数调用问题求助:骰子游戏概率脚本开发
解决R函数中变量未找到的问题
你遇到的Error in sort(attack, T) : object 'attack' not found错误,核心原因是R的函数作用域规则:attack和deff是dice()函数内部定义的局部变量,默认只能在dice()内部访问,fight()函数无法直接获取这些变量。另外你的fight()函数里使用的k和n也没有通过参数传入,同样会有作用域问题。
下面是具体的解决方案和优化后的代码:
第一步:修正dice()函数的返回结构
原来的dice()返回的是合并后的向量,无法区分attack和deff。我们改成返回一个列表,这样能明确传递两个独立的向量:
dice <- function(k, n) { # 初始化变量,避免不满足条件时返回空值 attack <- numeric(0) deff <- numeric(0) if (k > 3 && n > 2) { a <- 3 b <- 2 attack <- sample(1:6, a) deff <- sample(1:6, b) } # 返回包含attack和deff的列表 return(list(attack = attack, deff = deff)) }
第二步:修改fight()函数,通过参数接收所需变量
让fight()直接接收attack、deff、k、n作为参数,这样就能合法访问这些变量了。同时优化代码可读性:
fight <- function(attack, deff, k, n) { # 先检查骰子数量是否符合预期 if (length(attack) == 3 && length(deff) == 2) { # 预排序骰子,避免重复调用sort sorted_attack <- sort(attack, decreasing = TRUE) sorted_deff <- sort(deff, decreasing = TRUE) # 对比第一大的骰子 if (sorted_attack[1] > sorted_deff[1]) { n <- n - 1 } else { k <- k - 1 } # 对比第二大的骰子 if (sorted_attack[2] > sorted_deff[2]) { n <- n - 1 } else { k <- k - 1 } } # 返回更新后的k和n return(c(k, n)) }
第三步:正确调用两个函数
将dice()的结果保存为列表,再把其中的attack、deff和初始的k、n一起传给fight():
# 初始化k和n的初始值(示例值,满足dice的条件) k_start <- 4 n_start <- 3 # 获取骰子结果 dice_outcome <- dice(k_start, n_start) # 调用fight函数计算结果 updated_stats <- fight( attack = dice_outcome$attack, deff = dice_outcome$deff, k = k_start, n = n_start ) # 查看最终结果 cat("更新后的k值:", updated_stats[1], "\n") cat("更新后的n值:", updated_stats[2], "\n")
额外优化建议
- 用
decreasing = TRUE代替简写的T,代码更清晰,也避免和变量名冲突; - 在
dice()中初始化变量,防止不满足条件时返回空值导致后续报错; - 把重复的排序操作存为变量,提升代码效率和可读性。
内容的提问来源于stack exchange,提问作者Roy_Batty
相关产品推荐
相关产品推荐

