当将字符串传递给pmap_dfr()时,出现R derrr purrr错误

m528fe3b  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(105)

我正在准备一个函数来绘制三角函数。我写了一个函数,当给定参数时,它成功地返回了单个theta值的正确值,但是当我试图使用purrr::pmap_dfr()传递一个 Dataframe 时,每个参数都有一个列,以便生成一组要绘制的值时,我得到了一个错误,其消息似乎与情况不匹配。
这里有一个可重复的例子:

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返回错误:
dplyr::bind_rows()中的错误:!参数1必须是 Dataframe 或命名的原子向量。”
当我读到这个错误时,R抱怨对象argList不是一个 Dataframe ,但是当我运行下面的代码:is.data.frame(argList)时,返回的值是TRUE。
最后一位的返回值与错误消息不匹配,这告诉我argList不是一个 Dataframe 。两者都不可能是真的,我怀疑要么是我误解了错误消息,要么是pmap_dfr()函数中有一个bug。
有什么想法吗?

68de4m5k

68de4m5k1#

这个错误是指你的xformed_sine()函数返回的内容。你可以把它变成一个tibble,你的代码就会运行:

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()
一点额外的解释:这里有一个提示,purrr在完成Map函数后会遇到一个错误,因为它在rlang::last_error()中尝试绑定res上的行时失败了(res = map操作的结果):

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)


这是一种模棱两可的错误消息,虽然,我可以看到它是如何混淆没有任何额外的上下文。

相关问题