在tidyverse管道内对用户指定列调用interaction()生成唯一ID报错如何解决
报错根源
从报错回溯第18行可以定位到问题:你实际传递给interaction()的参数为list("list", lat, lon),你在拼接参数时额外加入了字符串"list",导致interaction()将这个长度为1的字符串也作为参与交互计算的变量,和数据框的列长度不匹配,内部调用unique()时触发报错。
修复方案
目前dplyr已全面采用基于rlang的整洁评估语法,下划线后缀的动词(如mutate_)早已废弃,推荐使用更简洁的动态参数写法:
library(dplyr) library(rlang) create_unique_id <- function(df, metadata_coords = NULL, unique_id_coords) { # 将传入的列名字符串转为符号列表 id_vars <- syms(unique_id_coords) df <- df %>% mutate(unique_id = interaction(!!!id_vars)) return(df) }
调用测试
result <- create_unique_id( df = mini_df, unique_id_coords = c("lat", "lon") )
运行后生成的unique_id列和函数外手动计算的结果完全一致。
旧写法兼容方案
如果需要兼容旧版dplyr,要修复原有interp写法只要去掉多余的"list"拼接即可:
library(lazyeval) create_unique_id_old <- function(df, metadata_coords, unique_id_coords) { df <- df %>% mutate_(id = interp(~interaction(!!!args), args = lapply(unique_id_coords, as.name))) return(df) }
内容的提问来源于stack exchange,提问作者Gheorghe Smintinescu
相关产品推荐
相关产品推荐

