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
相关产品推荐
相关产品推荐

