curl 命令在 Mac 和 Windows 上的行为不同
curl command behaves differently on Mac and Windows
我有一些适用于 Mac 的 R 代码,但其他人正试图 运行 它适用于 Windows 但它似乎不起作用。我一直使用的代码是:
for(i in 1:length(SNPs.needproxies)){
print(i)
system(paste0("curl -k -X GET 'https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=",SNPs.needproxies[i],"&pop=MXL&r2_d=r2&token=",token,"' > ", dir,"out.",SNPs.needproxies[i],".txt"))
}
如果我在 Windows 上尝试 运行 这个,我会收到错误消息
https not supported or disabled'.
我们已经缩小了问题范围,似乎地址中的单引号应该替换为双引号。然而,由于这是在 paste0()
函数中,它认为这是另外一回事,所以我们考虑用反斜杠转义双引号,即
\"https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=",SNPs.needproxies[i],"&pop=MXL&r2_d=r2&token=",token,"\"
这种工作方式在于它提供了我们想要的输出,但它应该将其打印到一个名为 dir/out.file.txt 的文件中,但它不会执行这一部分。
SNPs.needproxies是:
SNPs.needproxies <- c("rs709692","rs9659182","rs13064990","rs11130017","rs9832922" ,"rs36120363","rs4727815","rs7994762","rs72772387")
我有一个网站令牌,但无法共享,但它存储在名为令牌的对象中。
与 paste0()
本身无关,但与 curl
的 Windows 版本无关,需要 将 https 地址包含在其中double- 而不是 single-quotes。
检查 here 以获得此问题的完整分解。
1。带有 curl -o 选项的 system()
在注意到 Windows 上的 curl 要求将 https 地址包含在双精度内而不是 single-quotes 之后,我将完全避免剩余的管道问题并使用 -o
选项在 curl 中指定一个文件来写入结果,如果你坚持写出命令:
system(paste0("curl -k -X GET \"https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=", SNPs.needproxies[i], "&pop=MXL&r2_d=r2&token=", token, "\" -o out.", SNPs.needproxies[i], ".txt"))
2。 curl_download()
或者,R 有一些 curl-based 包可以处理所有这些细节,例如 curl
:
library(curl)
url <- sprintf("https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=%s&pop=MXL&r2_d=r2&token=%s", SNPs.needproxies[i], token)
curl_download(url, sprintf("out.%s.txt", SNPs.needproxies[i]))
3。 file.download()
在这种情况下,您也可以按照康拉德的建议使用 file.download()
:
url <- sprintf("https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=%s&pop=MXL&r2_d=r2&token=%s", SNPs.needproxies[i], token)
download.file(url, sprintf("out.%s.txt", SNPs.needproxies[i]))
4。获取()
您还可以使用 httr
库中的 GET()
:
library(httr)
u <- "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy"
q <- list(var = SNPs.needproxies[i],
pop = "MXL",
r2_d = "r2",
token = token)
f <- sprintf("out.%s.txt", SNPs.needproxies[i])
GET(url = u, query = q, write_disk(f))
5。 LDproxy()
请注意,似乎有一个 R 包专门用于连接此 API here。在您的情况下,代码为:
library(LDlinkR)
LDproxy(snp = SNPs.needproxies[i],
pop = "MXL",
r2d = "r2",
token = token,
file = sprintf("out.%s.txt", SNPs.needproxies[i]))
Windows 中的标准 curl 调用是 PowerShell 的 Invoke-RestMethod 的封装版本,这就是为什么根据您使用 Linux 还是 [=14 进行系统调用会导致不同结果的原因=].我建议在 R 中使用 httr 包,尽管它需要翻译调用。
我有一些适用于 Mac 的 R 代码,但其他人正试图 运行 它适用于 Windows 但它似乎不起作用。我一直使用的代码是:
for(i in 1:length(SNPs.needproxies)){
print(i)
system(paste0("curl -k -X GET 'https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=",SNPs.needproxies[i],"&pop=MXL&r2_d=r2&token=",token,"' > ", dir,"out.",SNPs.needproxies[i],".txt"))
}
如果我在 Windows 上尝试 运行 这个,我会收到错误消息
https not supported or disabled'.
我们已经缩小了问题范围,似乎地址中的单引号应该替换为双引号。然而,由于这是在 paste0()
函数中,它认为这是另外一回事,所以我们考虑用反斜杠转义双引号,即
\"https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=",SNPs.needproxies[i],"&pop=MXL&r2_d=r2&token=",token,"\"
这种工作方式在于它提供了我们想要的输出,但它应该将其打印到一个名为 dir/out.file.txt 的文件中,但它不会执行这一部分。
SNPs.needproxies是:
SNPs.needproxies <- c("rs709692","rs9659182","rs13064990","rs11130017","rs9832922" ,"rs36120363","rs4727815","rs7994762","rs72772387")
我有一个网站令牌,但无法共享,但它存储在名为令牌的对象中。
与 paste0()
本身无关,但与 curl
的 Windows 版本无关,需要 将 https 地址包含在其中double- 而不是 single-quotes。
检查 here 以获得此问题的完整分解。
1。带有 curl -o 选项的 system()
在注意到 Windows 上的 curl 要求将 https 地址包含在双精度内而不是 single-quotes 之后,我将完全避免剩余的管道问题并使用 -o
选项在 curl 中指定一个文件来写入结果,如果你坚持写出命令:
system(paste0("curl -k -X GET \"https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=", SNPs.needproxies[i], "&pop=MXL&r2_d=r2&token=", token, "\" -o out.", SNPs.needproxies[i], ".txt"))
2。 curl_download()
或者,R 有一些 curl-based 包可以处理所有这些细节,例如 curl
:
library(curl)
url <- sprintf("https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=%s&pop=MXL&r2_d=r2&token=%s", SNPs.needproxies[i], token)
curl_download(url, sprintf("out.%s.txt", SNPs.needproxies[i]))
3。 file.download()
在这种情况下,您也可以按照康拉德的建议使用 file.download()
:
url <- sprintf("https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=%s&pop=MXL&r2_d=r2&token=%s", SNPs.needproxies[i], token)
download.file(url, sprintf("out.%s.txt", SNPs.needproxies[i]))
4。获取()
您还可以使用 httr
库中的 GET()
:
library(httr)
u <- "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy"
q <- list(var = SNPs.needproxies[i],
pop = "MXL",
r2_d = "r2",
token = token)
f <- sprintf("out.%s.txt", SNPs.needproxies[i])
GET(url = u, query = q, write_disk(f))
5。 LDproxy()
请注意,似乎有一个 R 包专门用于连接此 API here。在您的情况下,代码为:
library(LDlinkR)
LDproxy(snp = SNPs.needproxies[i],
pop = "MXL",
r2d = "r2",
token = token,
file = sprintf("out.%s.txt", SNPs.needproxies[i]))
Windows 中的标准 curl 调用是 PowerShell 的 Invoke-RestMethod 的封装版本,这就是为什么根据您使用 Linux 还是 [=14 进行系统调用会导致不同结果的原因=].我建议在 R 中使用 httr 包,尽管它需要翻译调用。