当您想将R包添加到运行R的新操作系统时,您需要了解所需的任何底层操作系统包.在这种情况下,读sf
的DESCRIPTION
,我们看到
SystemRequirements: GDAL (>= 2.0.1), GEOS (>= 3.4.0), PROJ (>= 4.8.0), sqlite3
如何了解这些标签的含义并不总是直观的.您可能会在Posit's Package Manager中寻找关于这一点的提示,它列出了Ubuntu 22.04(rocker/shiny
基于此)上的以下操作系统要求.
apt-get install -y libgdal-dev
apt-get install -y gdal-bin
apt-get install -y libgeos-dev
apt-get install -y libproj-dev
apt-get install -y libsqlite3-dev
apt-get install -y libssl-dev
apt-get install -y libudunits2-dev
其中许多人可能已经存在.
首先,让我重复一下这个问题:
$ docker build -t quux .
$ docker run -it --rm quux R --quiet
> library("sf")
Error: package or namespace load failed for ‘sf’ in dyn.load(file, DLLpath = DLLpath, ...):
unable to load shared object '/usr/local/lib/R/site-library/units/libs/units.so':
libudunits2.so.0: cannot open shared object file: No such file or directory
根据经验,我知道Jammy(22.04)需要这些软件包作为R的sf
软件包,在你的Dockerfile
软件包中添加这些代码:
# ...
RUN apt-get update && \
apt-get install -y libproj22 libudunits2-0 libgdal30 && \
rm -rf /var/lib/apt/lists/*
RUN R -e "install.packages('sf')"
注:
apt
和install.packages(..)
命令由你决定.rm -rf
命令).它现在起作用:
$ docker build -t quux .
$ docker run -it --rm quux R --quiet
> library("sf")
Linking to GEOS 3.10.2, GDAL 3.4.1, PROJ 8.2.1; sf_use_s2() is TRUE