Это должно работать:
varClasses <- rapply(m$storage.mode, typeof)
Вот что я получаю:
> rapply(m$storage.mode, typeof)
speed dist
"double" "double"
(Это связано с тем, что cars
хранится как двойные в моей версии R. Результаты совпадают с вашими при изменении типа на целые числа - см. Обновление 1 ниже.)
Использование этого для создания struct
объекта - это просто вопрос замены этих типов соответствующими типами C (например, изменение int
на integer
), что можно сделать с помощью поиска в списке, и тогда вы можете используйте paste
для создания соответствующего списка аргументов.
Вот как m
выглядит для меня, используя те же команды, что и вы:
> str(m)
<mmap:/tmp/Rtmpz...> (struct) struct [1:50, 1:2] 4 ...
data :<externalptr>
bytes : num 800
filedesc : Named int 3
- attr(*, "names")= chr "/tmp/RtmpzGwIDT/file77aa9d47"
storage.mode :List of 2
$ speed:Classes 'Ctype', 'double' atomic (0)
.. ..- attr(*, "bytes")= int 8
.. ..- attr(*, "signed")= int 1
$ dist :Classes 'Ctype', 'double' atomic (0)
.. ..- attr(*, "bytes")= int 8
.. ..- attr(*, "signed")= int 1
- attr(*, "bytes")= int 16
- attr(*, "offset")= int [1:2] 0 8
- attr(*, "signed")= logi NA
- attr(*, "class")= chr [1:2] "Ctype" "struct"
pagesize : num 4096
dim :NULL
Обновление 1: когда я явно преобразовал cars
в целые числа и убедился, что объект является фреймом данных (т. Е. cars2 <- as.data.frame(apply(cars, 2, as.integer)); colnames(cars2) = colnames(cars)
), все работает, и rapply
выдает "integer"
, как и ожидалось.
Обновление 2: вот хак при создании внутренних аргументов для передачи struct()
:
oTypes = rapply(m$storage.mode, typeof)
lNames = names(oTypes)
lTypes = as.character(oTypes)
lTypes = paste(lTypes,'()', sep = "")
lArgs = paste(lNames, lTypes, sep = "=", collapse = ",")
Это приблизительное значение, потому что я подозреваю, что lTypes
необходимо преобразовать из типов R в C.