You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.0 KiB
57 lines
1.0 KiB
|
|
extension SEXP {
|
|
|
|
var count: R_len_t {
|
|
Rf_length(self)
|
|
}
|
|
|
|
var typeOf: SEXPTYPE {
|
|
SEXPTYPE(TYPEOF(self))
|
|
}
|
|
|
|
var isSTRING: Bool {
|
|
self.typeOf == STRSXP
|
|
}
|
|
|
|
}
|
|
|
|
extension String {
|
|
|
|
init?(_ sexp: SEXP) {
|
|
if ((sexp != R_NilValue) && (Rf_length(sexp) == 1)) {
|
|
switch (TYPEOF(sexp)) {
|
|
case STRSXP: self = String(cString: R_CHAR(STRING_ELT(sexp, 0)))
|
|
default: return(nil)
|
|
}
|
|
} else {
|
|
return(nil)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
extension Array where Element == String {
|
|
|
|
init?(_ sexp: SEXP) {
|
|
if (sexp.isSTRING) {
|
|
var val : [String] = [String]()
|
|
val.reserveCapacity(Int(sexp.count))
|
|
for idx in 0..<sexp.count {
|
|
val.append(String(cString: R_CHAR(STRING_ELT(sexp, R_xlen_t(idx)))))
|
|
}
|
|
self = val
|
|
} else {
|
|
return(nil)
|
|
}
|
|
}
|
|
|
|
var SEXP: SEXP? {
|
|
let charVec = Rf_protect(Rf_allocVector(SEXPTYPE(STRSXP), count))
|
|
defer { Rf_unprotect(1) }
|
|
for (idx, elem) in enumerated() { SET_STRING_ELT(charVec, idx, Rf_mkChar(elem)) }
|
|
return(charVec)
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|