用RJSONIO包挪用天气数据
JSON(JavaScript Object Notation)是一种轻量级的数据互换名目。易于阅读和编写,同时也易于呆板理会和生成。 JSON回收完全独立于语言的文本名目,可是也利用了雷同于C语言家属的习惯(包罗C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为抱负的数据互换语言。今朝有很多API处事提供了JSON的数据名目。
假如我们要在R语言中处理惩罚json数据,可以回收的扩展包有rjson和rjsonio两个包。从本人感受来看,rjsonio包要更为友好一些,读取之后可以直接转为简朴的list名目,利便挪用数据。rjson的话也可以转为list,但个中条理干系巨大,不大利便处理惩罚。下面我们用一个例子来看看如何用RJSONIO包挪用数据。我们但愿编一个函数从wunderground的API挪用当地都市的天气预报。其根基步调如下:
运行函数的功效看起来就象下面这样:
> getweather(‘wuhan’)
$都市
[1] “武漢市, Hubei”
$当前
[1] “20°C 晴”
$来日诰日
[1] “27°C-18°C 大概有雨”
Google也有提供天气预报的API,可是数据不是很富厚。wunderground提供的数据则相当富厚,它的天气API也被数据源手册所推荐。该API也可以回收都市名称作为输入,但有时候不大灵光,所以转而用经纬度作输入参数。利用这个API还要留意一点,其免费账户的限制是每分钟10次挪用,超出会有告诫邮件发出来。
R代码如下:(RSS用户看不到代码,是因为代码存放在gist.github.com上,然后以js形式放在博客中,你可以点这里寓目。别的假如要运行这个水平,需要将yourkey换成你本身申请的key,输入的都市名双方要加引号)
# 加载所需扩展包 library(RCurl)library(RJSONIO)library(XML)# 成立一个按照网址提取天气预报的子函数fromurl<- function(finalurl) { # 先读取网页,再理会JSON数据存在raw中 web <- getURL(finalurl) raw <-fromJSON(web) high <- raw$forecast$simpleforecast$forecastday[[2]]$high[‘celsius’] low <- raw$forecast$simpleforecast$forecastday[[2]]$low[‘celsius’] condition <- raw$forecast$simpleforecast$forecastday[[2]]$conditions currenttemp <- raw$current_observation$temp_c currentweather <- raw$current_observation$weather city <- as.character(raw$current_observation$display_location[‘full’]) result <-list(city=city,current=paste(currenttemp,’°C ‘,currentweather,sep=”), tomorrow=paste(high,’°C’,’-‘,low,’°C ‘,condition,sep=”)) names(result) <-c(‘都市’,’当前’, ‘来日诰日’) return(result) }# 提取天气预报的主函数getweather <- function(city=”) { # 假如用户输入为空,则按照IP地点来查询 if (city == ”) { finalurl <- ‘http://api.wunderground.com/api/yourkey/conditions/ forecast/lang:CN/q/autoip.json’ return(fromurl(finalurl)) # 不然就挪用google API,这时需要用XML包来理会数据获得经纬度 } else { requestUrl<-paste(“http://maps.googleapis.com/maps/api/geocode/xml?address=” ,city,”&sensor=false”, sep=””) xmlResult<-xmlTreeParse(requestUrl,isURL=TRUE) root <- xmlRoot(xmlResult) lat <-xmlValue(root[[‘result’]][[‘geometry’]][[‘location’]][[‘lat’]]) lon <-xmlValue(root[[‘result’]][[‘geometry’]][[‘location’]][[‘lng’]]) url <- ‘http://api.wunderground.com/api/yourkey/conditions/forecast/lang:CN/q/’ # 将经纬度与其它信息相团结,形成查询地点 finalurl <- paste(url,as.character(lat),’,’,as.character(lon),’.json’,sep=”) return(fromurl(finalurl)) }}