在不加载的情况下检查R会话中的DLL

在不加载的情况下检查R会话中的DLL,r,dll,R,Dll,如何检查给定的DLL是否在给定的R包中找到,即不使用dyn.load加载它?如果加载了相关的名称空间,则getLoadedDell等函数将显示它们。我需要在不显式加载名称空间的情况下执行此检查。如果要检查给定的dll,那么您将知道包的名称及其在包目录中的相对位置。因此,您可以使用file.exists: package如果要检查给定的dll,那么您将知道包的名称及其在包目录中的相对位置。因此,您可以使用file.exists: package以下函数查找给定包名和DLL名的DLL文件。如果DLL

如何检查给定的DLL是否在给定的R包中找到,即不使用dyn.load加载它?如果加载了相关的名称空间,则getLoadedDell等函数将显示它们。我需要在不显式加载名称空间的情况下执行此检查。

如果要检查给定的dll,那么您将知道包的名称及其在包目录中的相对位置。因此,您可以使用file.exists:


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"