boB Rudis
3 years ago
3 changed files with 61 additions and 3 deletions
@ -0,0 +1,57 @@ |
|||||
|
|
||||
|
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) |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
Loading…
Reference in new issue