关于 dplyr 和 mutate 中的 map_chr() 函数的清晰度?

Clarity about map_chr() function in dplyr and mutate?

抱歉,函数式编程“循环”让我有点头疼 purrr

我知道要使用自己的非矢量化函数,可以使用 map_chr() 并且我将它与 mutate 一起使用以生成 2 个新列。但有一次我不明白 map_chr 是每次都取整列并每次都生成列表输出,还是只取一个值并将计算出的输出值放在新变量中。基本上 - 如果对于 SHASUM 列中的每个变量,map_chr returns 只是一个值,或者从中自动选择正确值的值列表?不好意思问题这么模糊,但是我觉得很难理解,不知道pipesmutate.

里面是怎么回事

下面是我的示例代码。

这是 valid/correct 对 map_chr() 的使用(更普遍的是来自 purrr 的映射函数)还是我应该有更好的东西完成了吗?

library(tidyverse)
library(lubridate)
library(urlshorteneR)

longLinkBase <- "https://lime.survey.server/334443?newtest=Y?&QID="

initData <- structure(list(SHASUM = c("4db194d", "44fc459", "eb81eb4", "3c37606", "1165fc2", "fd4f56b"), StartDate = c(44172L, 44172L, 44172L, 44172L, 44172L, 44172L)), row.names = c(NA, 6L), class = "data.frame")
# convert Excel date serial number into proper date 
initData$StartDate <- as.Date(initData$StartDate, origin = "1899-12-30")

getlongLink <- function(x,y){
  # combine long link base with the (subject) code 
  z <- URLencode(paste0(y,x))
  return(z)
}

getShortLink <- function(x){
  Sys.sleep(2)
  z <- isgd_LinksShorten(x)
  return(z)
}

# 3 Lines below are my question, really:
initData <- initData %>% 
  mutate(longLink = map_chr(SHASUM,getlongLink,y=longLinkBase))  %>% 
  mutate(shortLink = map_chr(longLink,getShortLink))

### Write out data as CSV file
write.csv(initData,file=paste0("./output/","shortLinks_",format(Sys.time(),"%Y-%m-%d_%H-%M_%b"),".csv"),na="")

map_chr是一个隐藏循环。使用它的好处是代码可以piped/chained在一起,可读性更好。

map_chr(SHASUM,getlongLink,y=longLinkBase) 等同于 -

getlongLink(initData$SHASUM[1], longLinkBase)
getlongLink(initData$SHASUM[2], longLinkBase)
getlongLink(initData$SHASUM[3], longLinkBase)
.....
.....

不同之处在于您不会 'see' 这些单独的调用,它们是在 map_chr 的幕后执行的。每个调用 returns 一个存储为新列的值。

我认为你的代码总体上很好,我只能建议一个小的改进,你可以将两个 mutate 调用合并为一个。

initData <- initData %>% 
  mutate(longLink = map_chr(SHASUM,getlongLink,y=longLinkBase),
         shortLink = map_chr(longLink,getShortLink))