在R中使用crossprod时如何避免循环回收警告?
解决R中向量-数组运算的弃用警告问题
你猜的没错!这个警告确实来自denom <- crossprod(df1, f) + df2 + 1这一行。问题出在crossprod(df1, f)的返回值类型上:当你给它传入两个向量时,它会返回一个1×1的矩阵(数组),而df2和1都是标量。在旧版本的R中,允许这种数组和标量的循环运算,但现在这个特性被标记为弃用,所以会弹出警告提示你改用更明确的类型转换。
两种解决方法:
- 方法1:将矩阵转换为向量
用as.vector()包裹crossprod的结果,把1×1矩阵转成长度为1的向量,这样和标量运算就完全符合现代R的规范了:
qq <- function(f, df1, df2, N){ denom <- as.vector(crossprod(df1, f)) + df2 + 1 # 转换为向量避免警告 numer <- (df1 * (f - 1)) return(numer / denom) }
- 方法2:直接提取矩阵的单个元素
既然crossprod(df1, f)只会返回一个值,你可以直接用索引提取这个标量值,这样运算更直接:
qq <- function(f, df1, df2, N){ denom <- crossprod(df1, f)[[1]] + df2 + 1 # 提取单个元素转为标量 numer <- (df1 * (f - 1)) return(numer / denom) }
测试修改后的函数
运行你的示例代码,现在应该不会再出现警告了:
qq(f = c(84.11, 4.05, 8.38), df1 = c(3, 1, 3), df2 = 24, N = 32) # 输出结果:[1] 0.9965738 0.0400826 0.0831335
内容的提问来源于stack exchange,提问作者rnorouzian
相关产品推荐
相关产品推荐

