这个问题与这个问题非常相似:Reading OneDrive files to R
但稍微有点扭曲:
我有一个打开数据库连接的 R 脚本。 大致就是这个代码(为了保护无辜而更改了名称):
jdbcDriver <- JDBC(driverClass="oracle.jdbc.driver.OracleDriver", classPath="C:/Users/JohnDoe/OneDrive - Job Corporation/Documents/Data/jar files/ojdbc8.jar")
jdbcConnection <- dbConnect(jdbcDriver, "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=place.company.com)(PORT=1234))(CONNECT_DATA=(SERVICE_NAME=ghjed)))", "abc_thing_prod_ro4", "AKabc$VxqcasdfdsTDYjZsadfcdy-pxEUW")
如您所见,在第一行中,我链接到代码所需的“.jar”文件的位置。 它已经在我的 OneDrive 中,并且因为我的 OneDrive 在本地映射到我,所以此代码运行良好并打开了连接。
问题是我需要能够与其他人共享此 R 代码,并且让代码在他们的计算机上运行时仍然有效。 (实际上,最终,所有这些 R 代码实际上都是在 powerBI 文件内运行)。 换句话说,我想我想要一行代码来从 OneDrive 读取/下载文件,以便它可以在其他计算机上运行。
在另一个问题的这个解决方案中,看起来它大致可以做到这一点。 看起来他的答案会下载 onedrive 上并已链接到的 csv,但一位评论者指出的问题是“如果您使用 OneDrive for Business 并且您的管理员已禁用通过链接使用公共文件共享”这是行不通的。 嗯,这正是我的情况。
话虽这么说,唯一运行此代码的人在我的组织内,并且允许从我共享的 Onedrive 链接下载。 当我尝试按原样运行解决方案代码时,出现错误“http 状态为‘403 禁止’
我只是运气不好吗? 如果我们的管理员不喜欢公共链接共享,有没有办法让 R 从 onedrive 链接读取(在其他计算机上运行时)?
更新以进一步澄清(希望如此)
重申一下,当我和我的同事通过将文件保存到我们都可以访问的 Onedrive 位置来共享 R 中的文件时,R 文件将包含指向 Onedrive 位置的代码行(我们应该能够访问),像这样的东西:
source("C:/Users/123456/OneDrive - Lifespan Corporation/PowerBI/Test_Auto.R")
即文件路径不同。 所以...即使我可以访问 onedrive 中的这些文件,如果我尝试在 R 中运行该行代码,它会失败并且我得到这个:
重申我的问题:
R 中是否有一种方法可以写入 Onedrive 文件路径或执行某些操作,无论哪个用户尝试运行代码,它都会允许访问。
我尝试使用文件的“web”地址,如下所示:
source("https://company-my.sharepoint.com/personal/123456_company_org/Documents/PowerBI/Test_Auto.R")
并遇到类似的错误。 但如果我将该行粘贴到浏览器中,它就会下载该文件,所以我绝对可以访问。
根据我们在评论中的转换:
在您的本地环境中,您有一个如下所示的文件夹:
C:/Users/Mako/OneDrive/file.jar
如果您与协作者共享该文件夹并且他们在本地环境中同步该文件夹,他们将拥有如下路径:
C:/Users/OtherUser/OneDrive/file.jar
因此,当
OtherUser
尝试访问路径 C:/Users/Mako/OneDrive/file.jar
时,他们会收到“没有这样的文件或目录”错误。
如果我们首先根据每个用户的已知本地环境路径验证路径,或者我们可以动态构建符合通用结构的路径,我们就可以解决这个问题。
动态地,我们可以使用像
sprintf()
这样的函数来构建基于用户的路径:
sprintf('C:/Users/%s/OneDrive/file.jar', Sys.info()[["user"]])
[1] "C:/Users/Mako/OneDrive/file.jar"
或者静态地我们可以指定两个路径:
path1 <- 'C:/Users/Mako/OneDrive/file.jar'
path2 <- 'C:/Users/OtherUser/OneDrive/file.jar'
然后检查有效路径:
if (file.exists(path1)) {
path <- path1
} else if (file.exists(path2)) {
path <- path2
} else {
print("Error, no valid path found")
}
试试这个
path = paste0(Sys.getenv("USERPROFILE"),
"/OneDrive - Job Corporation/Documents/Data/jar files/ojdbc8.jar")