我想连接下面的网址,我写了一个下面的函数来连接所有网址:
library(datetime)
library(lubridate)
get_thredds_url<- function(mon, hr){
a <-"http://abc.co.in/"
b <-"thredds/path/"
c <-paste0("%02d", ymd_h(mon))
d <-paste0(strftime(datetime_group, format="%Y%m%d%H"))
e <-paste0("/gfs.t%sz.pgrb2.0p25.f%03d",(c, hr))
url <-paste0(a,b,b,d)
return (url)
}
mon = datetime(2017, 9, 26, 0)
hr = 240
url = get_thredds_url(mon,hr)
print (url)
但是当我执行get_thredds_url()
:
错误:意外&#39;,&#39;在: &#34; d&lt; -paste0(strftime(datetime_group,format =&#34;%Y%m%d%H&#34;)) e控制-paste0(&#34; /gfs.t%sz.pgrb2.0p25.f%03d",(C,&#34; url&lt; -paste0(a,b,b,d)
paste0(a,b,b,d)中的错误:object&#39; a&#39;未找到 返回(网址) 错误:没有返回的功能,跳到顶层 } 错误:意外&#39;}&#39;在&#34;}&#34;
我的功能有什么问题,我该如何解决?
最终输出应为:
http://abc.co.in/thredds/path/2017092600/gfs.t00z.pgrb2.0p25.f240
答案 0 :(得分:1)
弄清楚它是什么有点麻烦,你正试图这样做。您的代码中似乎存在相当多的矛盾,特别是与您想要的最终输出相比。因此,我决定专注于您想要的输出和您在变量中提供的输入。
get_thredds_url <- function(yr, mnth, day, hrs1, hrs2){
part1 <- "http://abc.co.in/"
part2 <- "thredds/path/"
ymdh <- c(yr, formatC(c(mnth, day, hrs1), width=2, flag="0"))
part3 <- paste0(ymdh, collapse="")
pre4 <- formatC(hrs1, width=2, flag="0")
part4 <- paste0("/gfs.t", pre4, "z.pgrb2.0p25.f", hrs2)
return(paste0(part1, part2, part3, part4))
}
get_thredds_url(2017, 9, 26, 0, 240)
# [1] "http://abc.co.in/thredds/path/2017092600/gfs.t00z.pgrb2.0p25.f240"
关键是正确使用paste0()
,我认为formatC()
可能对某些人(包括我)来说是新的。
formatC()
在您提供的数字前面填充零,从而确保9
转换为09
,而12
仍为12
1}}。
请注意,此答案位于R
基础,不需要额外的包。
另请注意,您不应将url
和c
用作变量名称。这些名称已保留给R
中的其他功能。通过将它们用作变量名称,您将覆盖它们的实际目的,这可能(将)在某些时候导致问题
答案 1 :(得分:0)
使用sprintf
可以更好地控制插入字符串
library(lubridate)
get_thredds_url<- function(mon, hr){
sprintf("http://abc.co.in/thredds/path/%s/gfs.t%02dz.pgrb2.0p25.f%03d",
strftime(mon, format = "%Y%m%d%H", tz = "UTC"),
hour(mon),
hr)
}
mon <- make_datetime(2017, 9, 26, 0, tz = "UTC")
hr <- 240
get_thredds_url(mon, hr)
[1] "http://abc.co.in/thredds/path/2017092600/gfs.t00z.pgrb2.0p25.f240"