2016-11-21 4 views
0

Я написал функцию C++ для преобразования произвольного «data.frame», переданного из R (через Rcpp) в «CharacterMatrix». До сих пор эта функция сохраняется в файле с именем «df2String.cpp», который выглядит следующим образомПреобразовать объект «POSIX *» в «символ» с помощью Rcpp

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
CharacterMatrix df2String(DataFrame x) { 

    int nCols = x.size(); 
    CharacterVector chContents = as<CharacterVector>(x[1]); 

    int nRows = chContents.size(); 
    CharacterMatrix chOut(nRows, nCols); 

    for (int i = 0; i < nCols; i++) { 
    chContents = as<CharacterVector>(x[i]); 
    chOut(_, i) = chContents; 
    } 

    return chOut; 
} 

и дает прекрасные результаты, по крайней мере большую часть времени, например,

library(Rcpp) 
sourceCpp("df2String.cpp") 

df2String(beaver1)[1:5, ] 

    [,1] [,2] [,3] [,4] 
[1,] "346" "840" "36.33" "0" 
[2,] "346" "850" "36.34" "0" 
[3,] "346" "900" "36.35" "0" 
[4,] "346" "910" "36.42" "0" 
[5,] "346" "920" "36.55" "0" 


Однако, когда по крайней мере один столбец в указанное «data.frame» имеет класс «POSIX *», я получаю сообщение об ошибке ниже.

## add 'POSIX*' column 
beaver1.1 <- beaver1 
beaver1.1$time <- formatC(beaver1.1$time, flag = "0", width = 4) 
beaver1.1$year <- 1990 

beaver1.1$datetime <- paste(beaver1.1$year, beaver1.1$day, beaver1.1$time) 
beaver1.1$datetime <- strptime(beaver1.1$datetime, format = "%Y %j %H%M") 

df2String(beaver1.1) 

Ошибка в Eval (запасной (выражение), Envir, Enclos): не совместим с STRSXP

Будучи скорее новичок Rcpp (или C++), я бы будьте благодарны за любые советы о том, как сделать C++-функцию совместимой с «POSIX *». Прямо сейчас, я улавлю колонки «POSIX *» на стороне R и преобразую их в «символ», прежде чем передавать объект на свою пользовательскую функцию C++, но мне это не кажется очень удобным.

+1

Это происходит как с «POSIXlt», так и с «POSIXct»? «POSIXct» - это «double», поэтому, я думаю, вы получаете отформатированный номер? «POSIXlt» является «списком» внутри и, предположительно, не обрабатывается в rcpp (как преобразование «список» в «символ»). Эти классы имеют специфический метод 'as.character' и моделируют R-подобное принуждение, вам нужно либо преобразовать на R-стороне (как в настоящее время), либо построить и оценить вызов' as.character (my_POSIXlt) 'в rcpp , –

+0

Спасибо за подсказку @alexis_laz. Действительно, функция работает с объектами «POSIXct» и не работает только для «POSIXlt». – fdetsch

ответ

1

Вы полагаетесь на автоматическое преобразование того, что входит в символ, посредством преобразования as<CharacterVector>().

Теперь вы обнаруживаете, что он не работает для объектов datetime. Добро пожаловать в работу с типами.

Вам нужно будет добавить ветвь в свой код, который определяет тип, делает то, что вы делаете сейчас для целых и числовых векторов, но форматирует datetime в строку.

Здесь есть другие ответы, показывающие это: this is but one. У нас также есть one на Rcpp Gallery.

 Смежные вопросы

  • Нет связанных вопросов^_^