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

R语言函数内sample()函数的语法疑问及代码问题解析

R语言sample()函数嵌套调用的常见问题解析

可运行的示例代码

coup <- matrix(rep(c("tom", "shelby", "tina", "mariam"), 5), ncol = 1)

draw <- function(deck){
  sample <- sample(1:20, size = 20)
  deal <- deck[sample]
  print(deal)
}
draw(deck = coup)

核心疑问解答

1. 为什么用索引范围1:20而非直接传数据对象?

这里的需求是对整个deck做无放回全排列抽样(size=20等于数据总长度)。直接传数据对象会因为矩阵的类型特性产生歧义:

  • 若直接传矩阵deck,R会先将其扁平化为字符向量,但sample()对字符向量抽样时默认size=1,无法实现全排列;
  • 使用索引1:20抽样,再通过deck[sample]提取元素,逻辑更直观,能精准实现对整个矩阵的随机重排,同时避免矩阵类型带来的解析问题。

2. 为什么sample(deck)会报错?

函数内部第一行代码sample <- sample(1:20, size=20)犯了关键错误:变量名sample与内置抽样函数sample()重名。
这行代码执行后,sample不再是函数,而是被赋值为一个长度20的数值向量。此时再写sample(deck),R会试图把向量sample当作函数调用,属于语法错误,自然会报错。

3. 为什么sample(deck=coup)返回20个NA?

同样因为变量名sample覆盖了内置函数,此时sample是一个数值向量。sample(deck=coup)会被R解析为向量索引操作(等价于sample[deck = coup]):

  • coup是字符类型矩阵,用字符值去索引数值向量,无法匹配到任何有效位置;
  • 由于coup长度为20,最终返回20个NA。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:23:21