关于 dplyr 和 mutate 中的 map_chr() 函数的清晰度?
Clarity about map_chr() function in dplyr and mutate?
抱歉,函数式编程“循环”让我有点头疼 purrr
。
我知道要使用自己的非矢量化函数,可以使用 map_chr()
并且我将它与 mutate
一起使用以生成 2 个新列。但有一次我不明白 map_chr 是每次都取整列并每次都生成列表输出,还是只取一个值并将计算出的输出值放在新变量中。基本上 - 如果对于 SHASUM
列中的每个变量,map_chr returns 只是一个值,或者从中自动选择正确值的值列表?不好意思问题这么模糊,但是我觉得很难理解,不知道pipes
和mutate
.
里面是怎么回事
下面是我的示例代码。
这是 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))
抱歉,函数式编程“循环”让我有点头疼 purrr
。
我知道要使用自己的非矢量化函数,可以使用 map_chr()
并且我将它与 mutate
一起使用以生成 2 个新列。但有一次我不明白 map_chr 是每次都取整列并每次都生成列表输出,还是只取一个值并将计算出的输出值放在新变量中。基本上 - 如果对于 SHASUM
列中的每个变量,map_chr returns 只是一个值,或者从中自动选择正确值的值列表?不好意思问题这么模糊,但是我觉得很难理解,不知道pipes
和mutate
.
下面是我的示例代码。
这是 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))