我正在尝试在多个都市区绘制三个不同因变量的地图(每个因变量单独绘制)。为此,我尝试制作 2 个嵌套地图。我首先对一个都市区的 3 个不同变量进行操作 - 定义函数并通过地图运行它,它就可以工作。这部分的代码如下:
plot_fun <- function(x){
base_plot_2015$`14460` +
data_2015 %>% subset(met2013 == 14460) %>% subset(onetsoccode == "151021") %>%
geom_sf(mapping = aes_string(fill = x)) +
scale_fill_viridis_c(option = "plasma")
}
expl <- names(data_2015)[17:19]
expl <- set_names(expl)
plot_Boston <- map(expl, ~plot_fun(.x))
Run Code Online (Sandbox Code Playgroud)
这给了我一个包含 3 张地图的列表,到目前为止还不错。(请注意,base_plot 是一个列表,其中包含保存为都市区 ID 的每个都市区的地图,该 ID 存储为 double)。
接下来,我想做同样的事情,但也要对不同的地铁代码进行迭代。我尝试通过定义以下函数来做到这一点:
plot_fun <- function(x,y){
base_plot_2015$`y` +
data_2015 %>% subset(met2013 == y) %>% subset(onetsoccode == "151021") %>%
geom_sf(mapping = aes_string(fill = x)) +
scale_fill_viridis_c(option = "plasma")
}
Run Code Online (Sandbox Code Playgroud)
这个想法是将其映射到都会区域向量 (y) 上,以绘制每个因变量 (x)。然而,在我这样做之前,我无法让这个功能发挥作用。当我使用 运行此函数时plot_fun("work_home", 14460),出现以下错误:
base_plot_2015$y + data_2015 %>% 子集(met2013 == y) %>% 子集(onetsoccode == )中的错误:二元运算符的非数字参数
有人能指出我在这里做错了什么吗?
另外,为了制作嵌套地图,代码map(met, ~map(expl, ~plot_fun, y=.x))(其中 met 是都市区代码的向量)是否有意义?
TLDR:当您对 base_plot 列表进行子集化时,您需要使用[[运算符而不是$
在您的第二个版本中,该函数将其视为“y”字符串,而不是变量y。因为大概没有地铁代码“y”,NULL所以返回。二元运算符是+且NULL是非数字的。这是所发生情况的简化示例:
base_data <- list(
a = letters,
b = LETTERS,
c = rnorm(100)
)
getMyData <- function(y){
base_data$`x`
}
getMyData("a")
#> NULL
base_data$x <- "QSBjbHVlIHBlcmhhcHM="
val <- getMyData("a") %>% print()
#> [1] "QSBjbHVlIHBlcmhhcHM="
base64enc::base64decode(val) %>% rawToChar()
#> [1] "A clue perhaps"
Run Code Online (Sandbox Code Playgroud)
如果将函数更改为使用[[运算符,则可以使用变量中的字符串值y进行子集化:
actuallyGetMyData <- function(x){
base_data[[x]]
}
actuallyGetMyData("a")[1:10]
#> [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
Run Code Online (Sandbox Code Playgroud)
编辑:关于排列的映射(因为很难阅读注释中的代码)
该调用map(expl, ~plot_fun)创建一个返回 function 的匿名函数plot_fun。您要么需要删除匿名函数
map(met, ~map(expl, plot_fun, y=.x))
Run Code Online (Sandbox Code Playgroud)
或调用该函数
map(met, ~map(expl, ~plot_fun(.x, .y), .y=.x))
Run Code Online (Sandbox Code Playgroud)
我发现嵌套映射有点难以阅读(.x 变成 .y 等等),所以或者你可以先枚举所有组合,然后映射这些组合
plotVars <- expand.grid(expl, met)
plot_final <- map2(plotVars[[1]], plotsVars[[2]], plot_fun) %>%
set_names(paste(plotVars[[1]], plotVars[[2]], sep = "_"))
Run Code Online (Sandbox Code Playgroud)
请注意,您的plot_final列表将不再嵌套。