Ответ 1
Хотя для этого не может быть явной функции R, возможно, вы можете использовать команды оболочки (например, file
и ldd
), чтобы получить некоторые подсказки, не требуя восстановления R или доступа root к кластеру:
(rpath <- Sys.which("R"))
# R
# "/usr/bin/R"
Чтобы убедиться, что ldd
будет работать, посмотрите, какой тип файла он имеет:
system2("file", rpath)
# /usr/bin/R: Bourne-Again shell script, ASCII text executable
Если ваш показывает фактический исполняемый файл (например, ELF 64-bit LSB executable, x86-64, ...
), пропустите этот шаг.
script <- readLines(rpath)
script[grepl("/bin/", script)]
# [1] "#!/bin/bash"
# [2] " if [ -x \"/usr/${libnn}/R/bin/exec/R\" ]; then"
# [3] " elif [ -x \"/usr/${libnn_fallback}/R/bin/exec/R\" ]; then"
# [4] "## some systems have a more portable sed, e.g. /usr/xpg4/bin/sed on Solaris,"
# [5] "SED=/bin/sed"
# [6] " exec sh \"${R_HOME}/bin/Rcmd\" \"${@}\" ;;"
# [7] "R_binary=\"${R_HOME}/bin/exec${R_ARCH}/R\""
Это говорит мне, что фактический исполняемый файл /usr/lib/R/bin/exec/R
(или /usr/lib64/...
). Он принимает некоторые выводы, но это шаг. Это работает для меня с R-3.3.2 на ubuntu, поэтому я могу только предположить, что он будет похож на разные ОС. Если это неинформативно, вы можете также grep для "/lib"
или "/exec"
(или просто просмотреть весь файл script для других подсказок).
Как только вы узнаете путь, вызванный script (или если он не является script), найдите зависимости разделяемой библиотеки:
system2("ldd", "/usr/lib/R/bin/exec/R")
# linux-vdso.so.1 => (0x00007ffcfadcd000)
# libR.so => /usr/lib/R/lib/libR.so (0x00007f746f615000)
# libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f746f3eb000)
# libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f746f025000)
# libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f746eda8000)
# libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f746eaa2000)
# libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007f746e85b000)
# libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f746e61d000)
# liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f746e3fb000)
# libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f746e1ea000)
# libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f746dfd1000)
# librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f746ddc9000)
# libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f746dbc4000)
# libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f746d9b5000)
# /lib64/ld-linux-x86-64.so.2 (0x0000560abd5fa000)
# libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f746d78b000)
5-я строка этого вывода предполагает, что R использует библиотеку BLAS, в частности libblas3
.