簡體   English   中英

列表循環錯誤:對於 function 在 R 的 purrr::map2 內不起作用

[英]Looping error with lists: for function not works inside purrr::map2 in R

我構建了一個 function 以在purrr::map2 function 中使用它並在兩個列表中運行它。 當我單獨運行 function 步驟時,它工作正常。 但顯然在map2中它第一次運行(對於列表.x[[1]].y[[1]]的第一個元素),然后在第二輪中for function 中拋出此錯誤:

在此處輸入圖像描述

我怎樣才能找出它為什么不起作用?

PS:這里很難舉一個數據的例子,因為它們是這個 function 具有非常具體特征的列表。 我很抱歉。

按照 function:

df <- list()

build_HUW_raster <- function(.x, .y) {
  list.time <- .x %>%
    split(.$id) %>%
    purrr::map(~list(t=as.matrix(.x$date),
                     xy=unname(as.matrix(.x[,c(22,23)])))
    )
 
  for(i in 1:50){
    cat(i," ")
    path=list.time[[i]]
    ctmc=ctmcmove::path2ctmc(path$xy,path$t,r,method="LinearInterp")
    df[[i]] <- as.data.frame(do.call(cbind, ctmc))
  }
 
  df <-  df %>% purrr::map(~ group_by(., ec) %>%
                             summarise(rt = mean(rt)) %>%
                             arrange(desc(rt))
  )
 
  stacktime <- df %>% purrr::map(~ rename(., cell = ec)) %>%
    map(~dplyr::left_join(cargo.grid, ., by="cell", copy=T)) %>%
    map(~raster::rasterize(., r, field="rt", na.rm=F, background=0)) %>%
    raster::stack()
 
  stackprop <- .y %>%
    split(.$id) %>%
    purrr::map(~ raster::rasterize(., y = r,
                                   field=.$proportion,
                                   fun=function(x, ...)median(x))) %>%
                 raster::stack()
   
  stack_huw <- raster::overlay(raster::calc(stacktime, fun=function(x)
      ifelse(is.na(x), NA, x/sum(x, na.rm=T))), stackprop, fun=function(x,y)x*y
      )
 
      raster_mean <- raster::stackApply(stack_huw,
      indices = rep(1,raster::nlayers(stack_huw)),
      fun = "mean",
      na.rm = F
  )
}

result.list <- purrr::map2 (.x=list1, .y=list2, fun=build_HUW_raster)

原因是基於循環的元素。 [[提取列表元素並根據元素的 class ,如果它是向量/矩陣,則map將遍歷單個元素,或者在 data.frame 的情況下循環遍歷列,因為這些是單位。 通過使用[ ,它將元素提取為列表

list(1, 2, 3)[1]
[[1]]
[1] 1

對比

list(1, 2, 3)[[1]]
[1] 1

當我們遍歷map並應用一些需要特定結構的函數時,即colSums需要一個 matrix/data.frame 即。 帶有暗淡的屬性,如果我們使用[[

> map(replicate(2,  data.frame(col1 = 1:5, col2 = 6:10), simplify = FALSE)[[1]], colSums)
Error in .f(.x[[i]], ...) : 
  'x' must be an array of at least two dimensions
> map(replicate(2,  data.frame(col1 = 1:5, col2 = 6:10), simplify = FALSE)[1], colSums)
[[1]]
col1 col2 
  15   40 

在這里,我們可以將代碼更改為

purrr::map2(.x=list1[1], .y=list2[1], fun=build_HUW_raster)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM