File: SDMXDataStructures-methods.R

package info (click to toggle)
r-cran-rsdmx 1%3A0.6-5%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,024 kB
  • sloc: sh: 14; makefile: 2
file content (107 lines) | stat: -rw-r--r-- 4,333 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#' @name SDMXDataStructures
#' @rdname SDMXDataStructures
#' @aliases SDMXDataStructures,SDMXDataStructures-method
#' 
#' @usage
#' SDMXDataStructures(xmlObj, namespaces)
#' 
#' @param xmlObj object of class "XMLInternalDocument derived from XML package
#' @param namespaces object of class "data.frame" given the list of namespace URIs
#' @return an object of class "SDMXDataStructures"
#' 
#' @seealso \link{readSDMX}
#' @export
#' 
SDMXDataStructures <- function(xmlObj, namespaces){
  new("SDMXDataStructures",
      SDMX(xmlObj, namespaces),
      datastructures = datastructures.SDMXDataStructures(xmlObj, namespaces)
  )
}

#get list of SDMXDataStructure
#=============================
datastructures.SDMXDataStructures <- function(xmlObj, namespaces){
  
  datastructures <- NULL
  
  sdmxVersion <- version.SDMXSchema(xmlObj, namespaces)
  VERSION.21 <- sdmxVersion == "2.1"
  
  messageNsString <- "message"
  if(isRegistryInterfaceEnvelope(xmlObj, FALSE)) messageNsString <- "registry"
  messageNs <- findNamespace(namespaces, messageNsString)
  strNs <- findNamespace(namespaces, "structure")
  
  dsXML <- NULL
  if(VERSION.21){
    dsXML <- getNodeSet(xmlObj,
                        "//mes:Structures/str:DataStructures/str:DataStructure",
                        namespaces = c(mes = as.character(messageNs),
                                       str = as.character(strNs)))
  }else{
    dsXML <- getNodeSet(xmlObj,
                        "//mes:KeyFamilies/str:KeyFamily",
                        namespaces = c(mes = as.character(messageNs),
                                       str = as.character(strNs)))
  }
  if(!is.null(dsXML)){
    datastructures <- lapply(dsXML, SDMXDataStructure, namespaces)
  }
  return(datastructures)
}

#methods
#'@export
as.data.frame.SDMXDataStructures <- function(x, ...){
  
  out <- do.call("rbind.fill",
                 lapply(x@datastructures,
                        function(ds){
                          
                          names <- slot(ds, "Name")
                          dsf.names <- NULL
                          if(length(names) > 0){
                            dsf.names <- as.data.frame(names, stringsAsFactors = FALSE)
                            colnames(dsf.names) <- paste0("Name.", colnames(dsf.names))
                          }
                          
                          desc <- slot(ds, "Description")
                          dsf.desc <- NULL
                          if(length(desc) > 0){
                            dsf.desc <- as.data.frame(desc, stringsAsFactors = FALSE)
                            colnames(dsf.desc) <- paste0("Description.", colnames(dsf.desc))
                          }
                          
                          dsf <- data.frame(
                              id = slot(ds, "id"),
                              agencyID = slot(ds, "agencyID"),
                              stringsAsFactors = FALSE)
                          if(!is.null(dsf.names)){
                            dsf <- cbind(dsf, dsf.names, stringsAsFactors = FALSE)
                          }
                          if(!is.null(dsf.desc)){
                            dsf <- cbind(dsf, dsf.desc, stringsAsFactors = FALSE)
                          }
                           
                          dsf <- cbind(dsf,
                                       version = slot(ds, "version"),
                                       uri = slot(ds, "uri"),
                                       urn = slot(ds, "urn"),
                                       isExternalReference = slot(ds, "isExternalReference"),
                                       isFinal = slot(ds, "isFinal"),
                                       validFrom = slot(ds, "validFrom"),
                                       validTo = slot(ds, "validTo"),
                                       stringsAsFactors = FALSE
                                       )
                              
                          
                          return(dsf)
                        })
                 )
  return(encodeSDMXOutput(out))
  
}

setAs("SDMXDataStructures", "data.frame",
      function(from) as.data.frame.SDMXDataStructures(from));