微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

curl命令在Mac和Windows上的行为有所不同

如何解决curl命令在Mac和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.",".txt"))
}

如果我尝试在Windows上运行此程序,则会收到错误消息

不支持或禁用https”。

我们缩小了问题的范围,因为似乎地址中的单引号应替换为双引号。但是,由于它位于paste0()函数中,因此它认为这是另一回事,因此我们认为使用反斜杠将双引号转义,即, \"https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=","\"

这种工作方式是提供所需的输出,但应该将其打印到名为dir / out.file.txt之类的文件中,但它不会执行此部分。

SNPs.needproxies是:

SNPs.needproxies <- c("rs709692","rs9659182","rs13064990","rs11130017","rs9832922","rs36120363","rs4727815","rs7994762","rs72772387")

我有该网站的令牌,但无法共享,但存储在称为令牌的对象中。

解决方法

paste0()本身无关,但与Windows版本的curl无关,需要将https地址包含在 double-中而不是单引号。 检查here,以彻底解决此问题。

,

1。带有curl -o选项的system()

在注意到Windows上的curl要求将https地址括在双引号而不是单引号中之后,我将完全避免其余的管道问题,并在curl中使用-o选项来指定要写入的文件如果您坚持要写出命令,则结果为:

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.",".txt"))

2。 curl_download()

或者,R有一些基于curl的程序包,这些程序包负责所有这些细节,例如curl

library(curl)
url <- sprintf("https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=%s&pop=MXL&r2_d=r2&token=%s",token)
curl_download(url,sprintf("out.%s.txt",SNPs.needproxies[i]))

3。 file.download()

在这种情况下,您也可以按照Konrad的建议使用file.download()

url <- sprintf("https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=%s&pop=MXL&r2_d=r2&token=%s",token)
download.file(url,SNPs.needproxies[i]))

4。 GET()

您还可以在GET()库中使用httr

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],r2d = "r2",token = token,file = sprintf("out.%s.txt",SNPs.needproxies[i]))
,

Windows中的标准curl调用是PowerShell的Invoke-RestMethod的包装版本,因此,根据您使用的是Linux还是Windows,进行系统调用会导致不同的结果。我建议在R中使用 httr 软件包,尽管这需要翻译呼叫。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。