如何向h2o arrange函数传递动态列名?
解决H2O动态列名排序问题
这个问题我之前也踩过坑!原因很简单:h2o.arrange对参数的解析逻辑有点特殊——当你直接传字符串(比如"dist")时,它会把这个字符串当作列名去查找;但你传变量var的时候,它会把var当成字面列名去数据框里找,自然找不到就报错了。
下面给你三个实用的解决办法,都能避开硬编码列名的麻烦:
方法一:直接提取列对象传递
用H2O数据框的[[索引,把变量对应的列对象传给h2o.arrange,这样函数就能明确知道要排序的是哪一列:library(h2o) h2o.init() df <- as.h2o(cars) var <- "dist" h2o.arrange(df, df[[var]]) # 正常运行方法二:用非标准求值工具转换
借助rlang包的符号转换功能,把字符串变量转换成函数能识别的列名符号:library(h2o) library(rlang) h2o.init() df <- as.h2o(cars) var <- "dist" h2o.arrange(df, !!sym(var)) # 正常运行这里
sym(var)把字符串转成R的符号对象,!!是强制求值运算符,让h2o.arrange正确解析这个符号对应的列。方法三:用
do.call构造函数调用
把参数打包成列表,用do.call来调用h2o.arrange,这样变量里的字符串会被当作列名字符串传递,和硬编码效果一致:library(h2o) h2o.init() df <- as.h2o(cars) var <- "dist" do.call(h2o.arrange, list(df, var)) # 正常运行
内容的提问来源于stack exchange,提问作者J Li
相关产品推荐
相关产品推荐

