Это должно быть рабочим решением. Обратите внимание, что заморские территории смещают центроид Франции от материка Франции.
library(tidyverse)
#library(rworldmap)
library(sf)
# Data
library(spData)
library(spDataLarge)
# Get map data
worldMap <- map_data("world")
# Select only some countries and add values
europe <-
data.frame("country"=c("Austria",
"Belgium",
"Germany",
"Spain",
"Finland",
"France",
"Greece",
"Ireland",
"Italy",
"Netherlands",
"Portugal",
"Bulgaria","Croatia","Cyprus", "Czech Republic","Denmark","Estonia", "Hungary",
"Latvia", "Lithuania","Luxembourg","Malta", "Poland", "Romania","Slovakia",
"Slovenia","Sweden","UK", "Switzerland",
"Ukraine", "Turkey", "Macedonia", "Norway", "Slovakia", "Serbia", "Montenegro",
"Moldova", "Kosovo", "Georgia", "Bosnia and Herzegovina", "Belarus",
"Armenia", "Albania", "Russia"),
"Growth"=c(1.0, 0.5, 0.7, 5.2, 5.9, 2.1,
1.4, 0.7, 5.9, 1.5, 2.2, rep(NA, 33)))
# Merge data and keep only Europe map data
data("world")
worldMap <- world
worldMap$value <- europe$Growth[match(worldMap$region,europe$country)]
centres <-
worldMap %>%
filter()
st_centroid()
worldMap <- worldMap %>%
filter(name_long %in% europe$country)
# Plot it
centroids <-
centres$geom %>%
purrr::map(.,.f = function(x){data.frame(long = x[1],lat = x[2])}) %>%
bind_rows %>% data.frame(name_long = centres$name_long) %>%
left_join(europe,by = c("name_long" = "country"))
barwidth = 1
barheight = 0.75
ggplot()+
geom_sf(data = worldMap, color = "black",fill = "lightgrey",
colour = "white", size = 0.1)+
coord_sf(xlim = c(-13, 35), ylim = c(32, 71)) +
geom_rect(data = centroids,
aes(xmin = long - barwidth,
xmax = long + barwidth,
ymin = lat,
ymax = lat + Growth*barheight)) +
geom_text(data = centroids %>% filter(!is.na(Growth)),
aes(x = long,
y = lat + 0.5*Growth*0.75,
label = paste0(Growth," %")),
size = 2) +
ggsave(file = "test.pdf",
width = 10,
height = 10)
Вычисленный обходное решение:
foo() {
local a=$1
local b=$2
echo ${(j:---:)${=b}}
foreach d in ${${=b}}
do
echo $d
done
}
Где parameter2 является строкой белым разделенного текста, например, 'badkljf odod'
Вы не можете. Функции принимают позиционные параметры, как и любые другие команды.
Обратите внимание, что ваш обходной путь не позволяет ни одному из элементов «массива» содержать пробелы.
Самая чистая вещь, которую я могу придумать, - это потребовать от вызывающей стороны создать локальный массив, затем прочтите его из функции:
$ foo() {
for element in $FOO_ARRAY
do
echo "[$element]"
done
}
$ local FOO_ARRAY; FOO_ARRAY=(foo bar baz quux)
$ foo
[foo]
[bar]
[baz]
[quux]
Я знаю, что bash выполняет аналогичные акробатические трюки для своей системы завершения, и я думаю, что zsh тоже может. В этом нет ничего необычного.