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

R语言sapply在Vectorize向量化函数内的异常行为及解决

问题原因

这个异常是R中Vectorize()函数的默认行为导致的:

  • Vectorize()默认会对函数的所有输入参数执行向量化循环,对应参数vectorize.args的默认值是函数的所有形参,此处即同时包含x和mods两个参数。
  • 使用默认mods调用时,mods是函数定义中固定的默认值,不会参与向量化拆分,仅对x的每个元素单独调用crt,每次调用都会传入完整的c(5,7)作为mods,每次返回长度为2的向量,最终拼接为2行、列数等于x长度的矩阵,符合预期。
  • 显式传入mods = c(12,60)时,mods会被当作向量化参数,和x按R的广播规则配对调用:长度为100的x和长度为2的mods配对时,mods会被循环复用为12,60,12,60...,每次调用crt仅传入1个模数,返回1个标量结果,最终拼接为长度100的一维向量,就是你看到的异常输出。
修复方案

只需要在调用Vectorize()时指定仅对x参数做向量化即可,修改代码如下:

crt <- function(x, mods = c(5, 7)) {
  sapply(mods, \(y) x %% y)
}
# 仅指定x为需要向量化的参数
crt <- Vectorize(crt, vectorize.args = "x")

修改后测试:

  • 调用crt(1:100)仍会返回2行100列的预期矩阵
  • 调用crt(x = 1:100, mods = c(12, 60))会返回2行100列的矩阵,第一行是1:100 %% 12的结果,第二行是1:100 %% 60的结果,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:54:00