将数据帧传递给 pmap_dfr() 时出现 R dplyr 咕噜声错误

R dplyr purrr error when passing dataframe to pmap_dfr()

提问人:Charles Knell 提问时间:11/12/2023 最后编辑:Charles Knell 更新时间:11/12/2023 访问量:19

问:

我正在准备一个函数来绘制三角函数。我编写了一个函数,该函数在给定 theta 的单个值的参数时成功返回正确的值,但是当我尝试使用 purrr::p map_dfr() 为每个参数传递一个带有列的数据帧以生成一组值以绘制图形时,我收到一个错误,其消息似乎与情况不匹配。

下面是一个可重现的例子:

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)
        
        return(as.double(amplitude * sinpi(period(theta + horizontal_shift)) + vertical_shift))
}

pmap_dfr(argList, xformed_sine)

R 返回以下错误:

“错误: !参数 1 必须是数据帧或命名原子向量。dplyr::bind_rows()

当我读到错误时,R 抱怨对象 argList 不是数据帧,但当我运行此代码时:返回的值为 TRUE。is.data.frame(argList)

最后一位的返回与错误消息不匹配,这告诉我 argList 不是数据帧。两者都不可能是真的,我怀疑要么是我误解了错误消息,要么是 pmap_dfr() 函数中存在错误。

有什么想法吗?

R 咕噜咕 PMAP

评论


答:

0赞 andrew_reece 11/12/2023 #1

该错误指的是函数返回的内容。你可以把它变成一个小问题,你的代码将运行:xformed_sine()

xformed_sine <- function(theta, amplitude, period_denom, horizontal_shift, vertical_shift){
  period <- (2 * pi)/abs(period_denom)
  
  return(
    tibble(result = amplitude * sinpi(period(theta + horizontal_shift)) + vertical_shift)
  )
}

pmap_dfr(argList, xformed_sine)
# A tibble: 121 × 1
   result             
   <Period>           
 1 0S                 
 2 -0.15643446504023S 
 3 -0.309016994374948S
 4 -0.453990499739547S
 5 -0.587785252292474S
 6 -0.707106781186547S
 7 -0.809016994374947S
 8 -0.891006524188368S
 9 -0.951056516295154S
10 -0.987688340595138S
# … with 111 more rows
# ℹ Use `print(n = ...)` to see more rows

或者,只需保持原样并使用 .xformed_sine()pmap_dbl()

一点额外的解释:有一个提示,咕噜咕噜在完成映射功能遇到了错误,因为它在尝试绑定行时失败(res = 映射操作的结果):resrlang::last_error()

rlang::last_error()
<error/rlang_error>
Error in `dplyr::bind_rows()`:
! Argument 1 must be a data frame or a named atomic vector.
---
Backtrace:
 1. purrr::pmap_dfr(argList, xformed_sine)
 2. dplyr::bind_rows(res, .id = .id)

不过,这是一个模棱两可的错误消息,我可以看到它在没有任何额外上下文的情况下是如何令人困惑的。

评论

1赞 Charles Knell 11/12/2023
谢谢!我不知道我自己可能会为此挣扎多久才能找到答案(如果有的话)。