Discussion:
[Rcpp-devel] Construct data.table object at the C++ level ?
Dirk Eddelbuettel
2017-11-02 21:35:18 UTC
Permalink
Does anybody have any (public) code constructing data.table objects?

I can of course do as we do for data.frame, which is (essentially)
constructing a List and setting a class attribute at end. But I gather
someone may have done something somewhere already? C code works too, making
it shorter always works...

Dirk

PS Long-parked related wishlist ticket is at
https://github.com/Rdatatable/data.table/issues/1694
--
http://dirk.eddelbuettel.com | @eddelbuettel | ***@debian.org
Dirk Eddelbuettel
2017-11-03 04:24:27 UTC
Permalink
On 2 November 2017 at 15:36, Matt Dowle wrote:
| I replied in the issue.

So did I, now that I am back online after a company event.

I'll fill a simple concrete event: constructing a DT from a DF and then using
nanotime to construct sane nanotime/bit64 objects. All fine and trivial,
but would be nicer to do this -- and more -- and the C++ level.

| I don't know what you're asking for here. A data.table is a list of
| same-length vectors, so it's almost trivial to create. Then just add the

We understand that part.

We are less sure about to get to the bits that are not data.frame, and how to
do so at the C level.

Dirk

| attributes which setDT() does from R level, and trace that through to see
| what it does. I don't really get what you're asking for as on the face of
| it it's simple. I had asked in the issue about whether it's the recycling
| you need but I'm not clear.
|
| On Thu, Nov 2, 2017 at 2:35 PM, Dirk Eddelbuettel <***@debian.org> wrote:
|
| >
| > Does anybody have any (public) code constructing data.table objects?
| >
| > I can of course do as we do for data.frame, which is (essentially)
| > constructing a List and setting a class attribute at end. But I gather
| > someone may have done something somewhere already? C code works too,
| > making
| > it shorter always works...
| >
| > Dirk
| >
| > PS Long-parked related wishlist ticket is at
| > https://github.com/Rdatatable/data.table/issues/1694
| >
| > --
| > http://dirk.eddelbuettel.com | @eddelbuettel | ***@debian.org
| >
--
http://dirk.eddelbuettel.com | @eddelbuettel | ***@debian.org
Dirk Eddelbuettel
2017-11-04 20:22:42 UTC
Permalink
On 2 November 2017 at 23:24, Dirk Eddelbuettel wrote:
|
| On 2 November 2017 at 15:36, Matt Dowle wrote:
| | I replied in the issue.
|
| So did I, now that I am back online after a company event.
|
| I'll fill a simple concrete event: constructing a DT from a DF and then using
| nanotime to construct sane nanotime/bit64 objects. All fine and trivial,
| but would be nicer to do this -- and more -- and the C++ level.

Ok, the 'create a nanotime vector from int64_t' part is now sorted out [1],
and it trivially becomes a column in a data.frame and hence ...
|
| | I don't know what you're asking for here. A data.table is a list of
| | same-length vectors, so it's almost trivial to create. Then just add the
|
| We understand that part.
|
| We are less sure about to get to the bits that are not data.frame, and how to
| do so at the C level.

... in a data.table. But I still call setDT() via Rcpp::Function. I'll see
if I can play fast and loose and just set that S3 attribute directly.

I'll try to remind myself to write a Rcpp Gallery piece once I have all the
pieces. Having data.table objects with nanosecond-resolution time is pretty
slick.

Dirk

[1] Mostly, still uses one call via Rcpp::Function() to create the S4 object
which we may be able to amortise, but that may not really matter.


| Dirk
|
| | attributes which setDT() does from R level, and trace that through to see
| | what it does. I don't really get what you're asking for as on the face of
| | it it's simple. I had asked in the issue about whether it's the recycling
| | you need but I'm not clear.
| |
| | On Thu, Nov 2, 2017 at 2:35 PM, Dirk Eddelbuettel <***@debian.org> wrote:
| |
| | >
| | > Does anybody have any (public) code constructing data.table objects?
| | >
| | > I can of course do as we do for data.frame, which is (essentially)
| | > constructing a List and setting a class attribute at end. But I gather
| | > someone may have done something somewhere already? C code works too,
| | > making
| | > it shorter always works...
| | >
| | > Dirk
| | >
| | > PS Long-parked related wishlist ticket is at
| | > https://github.com/Rdatatable/data.table/issues/1694
| | >
| | > --
| | > http://dirk.eddelbuettel.com | @eddelbuettel | ***@debian.org
| | >
|
| --
| http://dirk.eddelbuettel.com | @eddelbuettel | ***@debian.org
--
http://dirk.eddelbuettel.com | @eddelbuettel | ***@debian.org
Dirk Eddelbuettel
2017-11-04 20:30:26 UTC
Permalink
On 4 November 2017 at 15:22, Dirk Eddelbuettel wrote:
|
| On 2 November 2017 at 23:24, Dirk Eddelbuettel wrote:
| |
| | On 2 November 2017 at 15:36, Matt Dowle wrote:
| | | I replied in the issue.
| |
| | So did I, now that I am back online after a company event.
| |
| | I'll fill a simple concrete event: constructing a DT from a DF and then using
| | nanotime to construct sane nanotime/bit64 objects. All fine and trivial,
| | but would be nicer to do this -- and more -- and the C++ level.
|
| Ok, the 'create a nanotime vector from int64_t' part is now sorted out [1],
| and it trivially becomes a column in a data.frame and hence ...
| |
| | | I don't know what you're asking for here. A data.table is a list of
| | | same-length vectors, so it's almost trivial to create. Then just add the
| |
| | We understand that part.
| |
| | We are less sure about to get to the bits that are not data.frame, and how to
| | do so at the C level.
|
| ... in a data.table. But I still call setDT() via Rcpp::Function. I'll see
| if I can play fast and loose and just set that S3 attribute directly.

Yes, seems to work (at least for a fresh and reasonable data.frame object):

//Rcpp::Function dt("setDT");
//return dt(df);
df.attr("class") = Rcpp::CharacterVector::create("data.table", "data.frame");
return(df);

Dirk
|
| I'll try to remind myself to write a Rcpp Gallery piece once I have all the
| pieces. Having data.table objects with nanosecond-resolution time is pretty
| slick.
|
| Dirk
|
| [1] Mostly, still uses one call via Rcpp::Function() to create the S4 object
| which we may be able to amortise, but that may not really matter.
|
|
| | Dirk
| |
| | | attributes which setDT() does from R level, and trace that through to see
| | | what it does. I don't really get what you're asking for as on the face of
| | | it it's simple. I had asked in the issue about whether it's the recycling
| | | you need but I'm not clear.
| | |
| | | On Thu, Nov 2, 2017 at 2:35 PM, Dirk Eddelbuettel <***@debian.org> wrote:
| | |
| | | >
| | | > Does anybody have any (public) code constructing data.table objects?
| | | >
| | | > I can of course do as we do for data.frame, which is (essentially)
| | | > constructing a List and setting a class attribute at end. But I gather
| | | > someone may have done something somewhere already? C code works too,
| | | > making
| | | > it shorter always works...
| | | >
| | | > Dirk
| | | >
| | | > PS Long-parked related wishlist ticket is at
| | | > https://github.com/Rdatatable/data.table/issues/1694
| | | >
| | | > --
| | | > http://dirk.eddelbuettel.com | @eddelbuettel | ***@debian.org
| | | >
| |
| | --
| | http://dirk.eddelbuettel.com | @eddelbuettel | ***@debian.org
|
| --
| http://dirk.eddelbuettel.com | @eddelbuettel | ***@debian.org
--
http://dirk.eddelbuettel.com | @eddelbuettel | ***@debian.org
Dirk Eddelbuettel
2017-11-06 16:54:42 UTC
Permalink
On 4 November 2017 at 15:30, Dirk Eddelbuettel wrote:
| | [1] Mostly, still uses one call via Rcpp::Function() to create the S4 object
| | which we may be able to amortise, but that may not really matter.

And I got rid of that part too.

Dirk
--
http://dirk.eddelbuettel.com | @eddelbuettel | ***@debian.org
Loading...