R语言:自定义函数中使用pivot_wider报错的解决方法
解决pivot_wider自定义函数中的变量引用错误
问题背景
在R中处理不同结构的输入表时,编写了包含pivot_wider的自定义函数,调用时触发错误:
Error in paste0({ : cannot coerce type 'closure' to vector of type 'character'
问题出在{{}}等变量引用语法的使用上,需要生成指定格式的透视结果。
测试数据
data <- data.frame( id = c(1, 2, 1, 2, 1, 2), name = c("jane", "jane", "lauran", "lauran", "james", "james"), month = c("april", "april", "may", "june", "june","june") )
错误的函数与调用代码
自定义函数(存在问题):
pivot_data <- function(input_data, measure_1){ output <- input_data %>% arrange(name, id) %>% pivot_wider(names_from = id, names_prefix = paste0({{measure_1}}, "_"), # 此处出错 values_from = {{measure_1}}) }
调用代码:
required_output <- pivot_data(input_data = data, measure_1 = month)
期望输出
| name | month_1 | month_2 |
|---|---|---|
| james | june | june |
| jane | april | april |
| lauran | may | june |
问题原因
paste0({{measure_1}}, "_")里的{{measure_1}}传递的是符号对象(而非字符型字段名),paste0无法直接处理符号类型,因此触发类型转换错误。而values_from = {{measure_1}}本身是正确的,因为pivot_wider支持符号输入。
修正后的函数
需要把符号转换为字符串,这里用rlang::as_name()配合ensym()捕获字段名:
library(dplyr) library(tidyr) pivot_data <- function(input_data, measure_1){ # 获取字段名的字符形式 measure_name <- rlang::as_name(rlang::ensym(measure_1)) output <- input_data %>% arrange(name, id) %>% pivot_wider( names_from = id, names_prefix = paste0(measure_name, "_"), values_from = {{measure_1}} ) return(output) }
或者更简洁的写法,直接在paste0中转换:
pivot_data <- function(input_data, measure_1){ output <- input_data %>% arrange(name, id) %>% pivot_wider( names_from = id, names_prefix = paste0(rlang::as_name({{measure_1}}), "_"), values_from = {{measure_1}} ) return(output) }
验证结果
调用修正后的函数:
required_output <- pivot_data(input_data = data, measure_1 = month) print(required_output)
输出结果:
# A tibble: 3 × 3 name month_1 month_2 <chr> <chr> <chr> 1 james june june 2 jane april april 3 lauran may june
完全匹配期望格式。
内容的提问来源于stack exchange,提问作者fe108
相关产品推荐
相关产品推荐

