使用purrr::pmap_dfr传入数据框时触发dplyr绑定错误的求助
问题分析与解决
错误根源
- 语法错误:函数中
period(theta + horizontal_shift)是把计算得到的数值period当作函数调用,属于语法错误,应改为乘法运算period * (theta + horizontal_shift)。 - 返回值不符合要求:
purrr::pmap_dfr要求每次调用传入的函数时,返回结果必须是数据框或命名原子向量。原函数返回单个未命名数值,导致dplyr::bind_rows无法将结果合并成数据框,从而抛出错误。错误信息中的"Argument 1"指的是函数返回的第一个结果,而非输入的argList。
修正后的代码
library(tidyverse) thetas <- seq(from = -3, to = 3, by = 0.05) amplitudes <- rep(1, times = length(thetas)) period_denoms<- rep(1, times = length(thetas)) horizontal_shifts <- rep(0, times = length(thetas)) vertical_shifts <- rep(0, times = length(thetas)) argList <- list(thetas, amplitudes, period_denoms, horizontal_shifts, vertical_shifts) %>% as_tibble(.name_repair = ~ c("theta", "amplitude", "period_denom", "horizontal_shift", "vertical_shift") ) # 修复语法错误,返回数据框格式结果 xformed_sine <- function(theta, amplitude, period_denom, horizontal_shift, vertical_shift){ period <- (2 * pi)/abs(period_denom) value <- amplitude * sinpi(period * (theta + horizontal_shift)) + vertical_shift tibble(theta = theta, sine_value = as.double(value)) } # 运行pmap_dfr生成数据集 result <- pmap_dfr(argList, xformed_sine) head(result)
另一种简化写法
如果不需要保留所有参数,也可以让函数返回命名向量,同样能被pmap_dfr处理:
xformed_sine <- function(theta, amplitude, period_denom, horizontal_shift, vertical_shift){ period <- (2 * pi)/abs(period_denom) value <- amplitude * sinpi(period * (theta + horizontal_shift)) + vertical_shift c(theta = theta, sine_value = as.double(value)) }
内容的提问来源于stack exchange,提问作者Charles Knell
相关产品推荐
相关产品推荐

