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

