使用sqldf的RH2驱动时报rJava错误,无Java安装权限求替代方案
解答
1. 是否必须使用rJava?
不需要。你当前的报错是因为代码指定了基于Java的H2作为sqldf的驱动,才会依赖RH2、RJDBC进而需要rJava库。sqldf默认使用的SQLite驱动完全不需要Java环境,也不依赖rJava包。
2. 无需rJava的sqldf修改方案
你仅需要移除RH2相关的加载逻辑和H2驱动指定的代码即可,你的合并逻辑不需要做任何调整,修改后的代码如下:
library(sqldf) nr1 <- 100 nc1 <- 4682 df1 <- as.data.frame(matrix(seq_len(nr1*nc1), nr1)) nr2 <- 100 nc2 <- 4903 df2 <- as.data.frame(matrix(seq_len(nr2*nc2), nr2)) # 不指定H2驱动,默认使用无Java依赖的SQLite驱动 res <- sqldf("select * from df1 a left join df2 b on a.V1 = b.V1 and a.V2 between b.V3 and b.V4")
列数超限问题处理
你的两个数据框列数较多,若运行时触发SQLite默认列数限制报错,可添加参数调整,示例如下:
res <- sqldf("select * from df1 a left join df2 b on a.V1 = b.V1 and a.V2 between b.V3 and b.V4", dbname = tempfile(), file.format = list(override = TRUE))
3. 其他无Java依赖的替代方案
如果不想使用sqldf,也可以使用R原生的非等值连接实现相同逻辑,性能更优:
- 使用data.table包的非等值连接,无列数限制,适合宽表场景:
library(data.table) setDT(df1) setDT(df2) res <- df2[df1, on = .(V1, V3 <= V2, V4 >= V2), allow.cartesian = TRUE]
内容的提问来源于stack exchange,提问作者Ash S
相关产品推荐
相关产品推荐

