从R调用Rust遇"Expected a vector type"错误的原因及解决方法
R与Rust交互:解决
1:3输入报错"Expected a vector type."的问题 错误原因
R中1:3生成的是整数型(integer)向量,而你定义的Rust函数参数为&[f64](浮点型切片)。extendr无法自动将整数向量转换为浮点切片,触发类型不匹配的错误;而c(1,2,3)默认生成的是数值型(double)向量,与f64类型匹配,因此能正常运行。
修复方法
有两种可行的修复方式:
方法1:在R调用时显式转换类型
将整数向量转为数值型后传入函数:
all_positive(as.numeric(1:3))
方法2:修改Rust函数,支持多数值类型
利用extendr的Num trait定义泛型函数,同时兼容整数和浮点类型:
use extendr_api::prelude::*; #[extendr] fn all_positive<T: Num + PartialOrd + FromPrimitive>(input: &[T]) -> bool { input.iter().all(|&x| x > T::from_f64(0.0).unwrap()) }
如果只需要支持整数类型,也可以直接修改参数类型:
#[extendr] fn all_positive(input: &[i32]) -> bool { input.iter().all(|&x| x > 0) }
Rust代码优化建议
你的原始代码逻辑正确,但可以用Rust的迭代器特性简化,更符合惯用写法:
#[extendr] fn all_positive(input: &[f64]) -> bool { input.iter().all(|&x| x > 0.0) }
- 用
iter().all()替代手动循环和状态变量,代码更简洁易读 - 直接返回迭代器方法的结果,无需额外定义
out变量
内容的提问来源于stack exchange,提问作者bretauv
相关产品推荐
相关产品推荐

