关于r:Sys.setenv(” SNC_LIB” = lib_path_64)失败

Sys.setenv(“SNC_LIB” = lib_path_64) fails

我正在使用软件包RSAP读取SAP数据。
RSAP加载SNC(安全网络连接)动态库,并使用环境变量SNC_LIB进行搜索。
根据本地用户系统的不同,它可能是32或64位的库。
我正在R脚本中设置环境变量。
但是RSAP仍然在旧的路径中进行搜索。
我尝试避免在应用程序外部设置环境变量,因为它是一个闪亮的应用程序,应被许多用户使用。

似乎仅在RSTUDIO会话中更改了环境变量,而没有在外部更改。

RStudio控制台中环境变量的初始情况:

1
2
3
4
  > Sys.getenv("SNC_LIB_64")
  [1]"C:\\\\Program Files\\\\SAP\\\\FrontEnd\\\\SecureLogin\\\\lib\\\\sapcrypto.dll"
  > Sys.getenv("SNC_LIB")
  [1]"C:\\\\Program Files (x86)\\\\SAP\\\\FrontEnd\\\\SecureLogin\\\\lib\\\\sapcrypto.dll"

编码:

1
2
3
4
5
6
7
8
  # check SNC_LIB path from environment variables
  # 32 or 64 bit?
  # if 64 bit lib path is set, set the default lib path variable
  # SNC_LIB to it
  lib_path_64 <- Sys.getenv("SNC_LIB_64")
  if (lib_path_64 !="") {
    Sys.setenv("SNC_LIB" = lib_path_64)
  }

在RStudio调试器中执行代码后:

1
2
  Browse[2]> Sys.getenv("SNC_LIB")
  [1]"C:\\\\Program Files\\\\SAP\\\\FrontEnd\\\\SecureLogin\\\\lib\\\\sapcrypto.dll"

RSAP在加载库时引发的错误:

1
2
  [Thr 12160] Wed Jan 03 17:42:57 2018
  [Thr 12160] *** ERROR => SncPDLInit()==SNCERR_INIT, Adapter #1 (C:\\Program Files (x86)\\SAP\\FrontEnd\\SecureLogin\\lib\\sapcrypto.dll) not loaded [sncxxdl.c  727]

使用了旧路径。当我在运行RStudio之前更改外部路径时,它可以正常工作。

问题:
有没有一种方法可以以另一种方式设置库路径变量SNC_LIB,以确保它是全局的而不是在本地更改的,并且RSAP动态加载运行良好?

简单的复制方式是:

  • 启动RStudio

  • 致电Sys.setenv(" TEST_VAR " = " good ")

  • 致电Sys.getenv(" TEST_VAR ")

  • 查看正确的结果[1] "好"

  • 关闭RStudio

  • 再次启动RStudio

  • 再次调用Sys.getenv(" TEST_VAR ")

  • 请参见\\'错误\\'意外结果[1] "


  • R中设置的环境变量会影响该进程及其运行的进程,当R退出时它们不会持久存在。

    目前尚不清楚您采取了什么步骤导致RSAP错误,但是您的"易于重现的代码"脚本是否按预期运行。

    R会话中Sys.setenv()会影响后续库加载的唯一方法是,如果该加载发生在R会话中(例如,加载用于加载库的R包)或R启动的进程(例如,运行中)使用system()的命令)。