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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:48:15