我正在使用RSAP包来读取SAP数据。 RSAP加载SNC(安全网络连接)动态库并使用环境变量SNC_LIB进行搜索。 根据本地用户系统,这可能是32位或64位库。 我在我的R脚本中设置环境变量。 但RSAP仍在寻找旧路。 我尽量避免在应用程序之外设置环境变量,因为它是一个应该被许多用户使用的闪亮应用程序。
似乎环境变量仅在RSTUDIO会话中更改,但不在外部更改。
RStudio控制台中环境变量的初始情况:
> 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"
编码:
# 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调试器中执行代码之后:
Browse[2]> Sys.getenv("SNC_LIB")
[1] "C:\\Program Files\\SAP\\FrontEnd\\SecureLogin\\lib\\sapcrypto.dll"
RSAP在加载库时抛出错误:
[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”=“好”)
致电Sys.getenv(“TEST_VAR”)
见正确的结果[1]“好”
关闭RStudio
再次启动RStudio
再次致电Sys.getenv(“TEST_VAR”)
看到“错误的”意外结果[1]“”
答案 0 :(得分:0)
在R中设置的环境变量会影响该进程并对其运行进行处理,当R退出时它们不会保留。
目前尚不清楚您采取了哪些步骤导致您的RSAP错误,但您的“简单重现代码”脚本正在按预期运行。
R会话中Sys.setenv()
影响后续库加载的唯一方法是在R会话中发生加载(例如加载加载库的R包)或者在进程R启动时(例如,使用system()
)运行命令。