Без выборочных данных, я думаю, что возможное решение может быть:
создать некоторые выборочные данные
library( sf)
#square of 2 x 2
pol = st_polygon(list(rbind(c(0,0), c(2,0), c(2,2), c(0,2), c(0,0))))
#add two more squares of 2 x 2
b = st_sfc(pol, pol + c(.8, .2), pol + c(4, .8))
plot(b)
рассчитать площадь перекрытия
l <- lapply( b, function(x) {
lapply(b, function(y) st_intersection( x, y ) %>% st_area() )
})
matrix(unlist(l), ncol = length(b), byrow = TRUE)
# [,1] [,2] [,3]
# [1,] 4.00 2.16 0
# [2,] 2.16 4.00 0
# [3,] 0.00 0.00 4
рассчитать процент перекрытия
l2 <- lapply( b, function(x) {
lapply(b, function(y) st_intersection( x, y ) %>% st_area() * 100 /sqrt( st_area(x) * st_area(y) ) )
})
matrix(unlist(l2), ncol = length(b), byrow = TRUE)
# [,1] [,2] [,3]
# [1,] 100 54 0
# [2,] 54 100 0
# [3,] 0 0 100
Функции, объявленные статичными, не видимы вне единицы перевода, они определяются в (единица перевода является в основном.c файлом). Если функция не должна быть вызвана снаружи файла, то это должно быть сделано статичным, чтобы не загрязнить глобальное пространство имен. Это делает конфликты между именами, которые являются тем же, менее вероятно, произойдут. Экспортируемые символы обычно indentified со своего рода тегом подсистемы, который далее уменьшает объем для конфликта.
Часто, указатели на эти функции заканчиваются в структурах, таким образом, их на самом деле называют снаружи файла, они определяются в, но не их именем функции.
По тем же причинам Вы используете статичный в любом коде. Необходимо только 'опубликовать' вызовы API, что-либо еще открывает Вас для злоупотребления, такие как способность вызвать внутренние функции снаружи драйвера, что-то, что почти наверняка было бы катастрофически.
Это - хорошая практика программирования, чтобы только сделать видимым к внешнему миру, что необходимо. Это - то, о чем инкапсуляция - все.