在不加载的情况下检查R会话中的DLL
如何检查给定的DLL是否在给定的R包中找到,即不使用dyn.load加载它?如果加载了相关的名称空间,则getLoadedDell等函数将显示它们。我需要在不显式加载名称空间的情况下执行此检查。如果要检查给定的dll,那么您将知道包的名称及其在包目录中的相对位置。因此,您可以使用file.exists:在不加载的情况下检查R会话中的DLL,r,dll,R,Dll,如何检查给定的DLL是否在给定的R包中找到,即不使用dyn.load加载它?如果加载了相关的名称空间,则getLoadedDell等函数将显示它们。我需要在不显式加载名称空间的情况下执行此检查。如果要检查给定的dll,那么您将知道包的名称及其在包目录中的相对位置。因此,您可以使用file.exists: package如果要检查给定的dll,那么您将知道包的名称及其在包目录中的相对位置。因此,您可以使用file.exists: package以下函数查找给定包名和DLL名的DLL文件。如果DLL
package如果要检查给定的dll,那么您将知道包的名称及其在包目录中的相对位置。因此,您可以使用file.exists:
package以下函数查找给定包名和DLL名的DLL文件。如果DLL文件可以在.libpath中的多个目录中找到,那么它将返回所有目录
pkg_dll_exists <- function(package, dll){
res <- lapply(.libPaths(), function(x){
lib1 <- file.path(x, package, "libs")
f1 <- list.files(path = lib1, pattern = "\\.dll", recursive = TRUE)
lib2 <- file.path(x, package, "inst")
f2 <- list.files(path = lib2, pattern = "\\.dll", recursive = TRUE)
f1 <- file.path(lib1, f1)
f2 <- file.path(lib2, f2)
c(f1, f2)
})
res <- unlist(res)
list(dll.exists = any(grepl(dll, res)), dll.file = res[grep(dll, res)])
}
pkg_dll_exists("foreign", "foreign.dll")
#$dll.exists
#[1] TRUE
#
#$dll.file
#[1] "C:/Program Files/R/site-library/foreign/libs/i386/foreign.dll"
#[2] "C:/Program Files/R/site-library/foreign/libs/x64/foreign.dll"
#[3] "C:/Program Files/R/R-4.0.2/library/foreign/libs/i386/foreign.dll"
#[4] "C:/Program Files/R/R-4.0.2/library/foreign/libs/x64/foreign.dll"
以下函数查找给定包名和DLL名称的DLL文件。如果DLL文件可以在.libpath中的多个目录中找到,那么它将返回所有目录
pkg_dll_exists <- function(package, dll){
res <- lapply(.libPaths(), function(x){
lib1 <- file.path(x, package, "libs")
f1 <- list.files(path = lib1, pattern = "\\.dll", recursive = TRUE)
lib2 <- file.path(x, package, "inst")
f2 <- list.files(path = lib2, pattern = "\\.dll", recursive = TRUE)
f1 <- file.path(lib1, f1)
f2 <- file.path(lib2, f2)
c(f1, f2)
})
res <- unlist(res)
list(dll.exists = any(grepl(dll, res)), dll.file = res[grep(dll, res)])
}
pkg_dll_exists("foreign", "foreign.dll")
#$dll.exists
#[1] TRUE
#
#$dll.file
#[1] "C:/Program Files/R/site-library/foreign/libs/i386/foreign.dll"
#[2] "C:/Program Files/R/site-library/foreign/libs/x64/foreign.dll"
#[3] "C:/Program Files/R/R-4.0.2/library/foreign/libs/i386/foreign.dll"
#[4] "C:/Program Files/R/R-4.0.2/library/foreign/libs/x64/foreign.dll"