Skip to content

Commit cd52b64

Browse files
authored
Merge pull request #122 from gregorgorjanc/gregorgorjanc/issue120
Added rtsk_individual_table_add_row() and tc.individual_table_add_row()
2 parents 08bc7e9 + 53b2890 commit cd52b64

9 files changed

Lines changed: 472 additions & 18 deletions

File tree

RcppTskit/NEWS.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ and releases adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html
2828
- Added `TableCollection$build_index()` to build indexes and
2929
`TableCollection$drop_index()` to drop indexes.
3030
- Added ``TableCollection$num_*()` getters for the number of rows in the tables.
31+
- Added `rtsk_individual_table_add_row()` and
32+
`TableCollection$individual_table_add_row()` to append individual rows from
33+
\code{R}, mirroring `tsk_individual_table_add_row()`.
3134
- TODO
3235

3336
### Changed

RcppTskit/R/Class-TableCollection.R

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,55 @@ TableCollection <- R6Class(
143143
rtsk_table_collection_get_num_individuals(self$xptr)
144144
},
145145

146+
#' @description Add a row to the individuals table.
147+
#' @param flags integer flags for the new individual.
148+
#' @param location numeric vector with the location of the new individual.
149+
#' @param parents integer vector with parent individual IDs (0-based).
150+
#' @param metadata for the new individual; accepts \code{NULL},
151+
#' a raw vector, or a character of length 1.
152+
#' @details See the \code{tskit Python} equivalent at
153+
#' \url{https://tskit.dev/tskit/docs/stable/python-api.html#tskit.IndividualTable.add_row}.
154+
#' The function casts inputs to the expected class.
155+
#' @return Integer row ID (0-based) of the newly added individual.
156+
#' @examples
157+
#' ts_file <- system.file("examples/test.trees", package = "RcppTskit")
158+
#' tc <- tc_load(ts_file)
159+
#' n_before <- tc$num_individuals()
160+
#' new_id <- tc$individual_table_add_row()
161+
#' new_id <- tc$individual_table_add_row(location = c(5, 8))
162+
#' new_id <- tc$individual_table_add_row(flags = 0L)
163+
#' new_id <- tc$individual_table_add_row(parents = c(0L, 2L))
164+
#' new_id <- tc$individual_table_add_row(metadata = "abc")
165+
#' new_id <- tc$individual_table_add_row(metadata = charToRaw("cba"))
166+
#' n_after <- tc$num_individuals()
167+
individual_table_add_row = function(
168+
flags = 0L,
169+
location = NULL,
170+
parents = NULL,
171+
metadata = NULL
172+
) {
173+
if (is.null(metadata)) {
174+
metadata_raw <- NULL
175+
} else if (is.raw(metadata)) {
176+
metadata_raw <- metadata
177+
} else if (
178+
is.character(metadata) && length(metadata) == 1L && !is.na(metadata)
179+
) {
180+
metadata_raw <- charToRaw(metadata)
181+
} else {
182+
stop(
183+
"metadata must be NULL, a raw vector, or a length-1 non-NA character string!"
184+
)
185+
}
186+
rtsk_individual_table_add_row(
187+
tc = self$xptr,
188+
flags = as.integer(flags),
189+
location = if (is.null(location)) NULL else as.numeric(location),
190+
parents = if (is.null(parents)) NULL else as.integer(parents),
191+
metadata = metadata_raw
192+
)
193+
},
194+
146195
#' @description Get the number of nodes in a table collection.
147196
#' @return A signed 64 bit integer \code{bit64::integer64}.
148197
#' @examples

RcppTskit/R/RcppExports.R

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,10 @@ rtsk_table_collection_metadata_length <- function(tc) {
203203
.Call(`_RcppTskit_rtsk_table_collection_metadata_length`, tc)
204204
}
205205

206+
rtsk_individual_table_add_row <- function(tc, flags = 0L, location = NULL, parents = NULL, metadata = NULL) {
207+
.Call(`_RcppTskit_rtsk_individual_table_add_row`, tc, flags, location, parents, metadata)
208+
}
209+
206210
test_tsk_bug_assert_c <- function() {
207211
invisible(.Call(`_RcppTskit_test_tsk_bug_assert_c`))
208212
}
@@ -235,3 +239,7 @@ test_rtsk_table_collection_build_index_forced_error <- function(tc) {
235239
invisible(.Call(`_RcppTskit_test_rtsk_table_collection_build_index_forced_error`, tc))
236240
}
237241

242+
test_rtsk_individual_table_add_row_forced_error <- function(tc) {
243+
invisible(.Call(`_RcppTskit_test_rtsk_individual_table_add_row_forced_error`, tc))
244+
}
245+

RcppTskit/inst/include/RcppTskit_public.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,10 @@ void rtsk_table_collection_build_index(SEXP tc, int options = 0);
5757
void rtsk_table_collection_drop_index(SEXP tc, int options = 0);
5858
Rcpp::List rtsk_table_collection_summary(SEXP tc);
5959
Rcpp::List rtsk_table_collection_metadata_length(SEXP tc);
60+
int rtsk_individual_table_add_row(
61+
SEXP tc, int flags = 0,
62+
Rcpp::Nullable<Rcpp::NumericVector> location = R_NilValue,
63+
Rcpp::Nullable<Rcpp::IntegerVector> parents = R_NilValue,
64+
Rcpp::Nullable<Rcpp::RawVector> metadata = R_NilValue);
6065

6166
#endif

RcppTskit/man/TableCollection.Rd

Lines changed: 71 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

RcppTskit/src/RcppExports.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,21 @@ BEGIN_RCPP
534534
return rcpp_result_gen;
535535
END_RCPP
536536
}
537+
// rtsk_individual_table_add_row
538+
int rtsk_individual_table_add_row(const SEXP tc, const int flags, const Rcpp::Nullable<Rcpp::NumericVector> location, const Rcpp::Nullable<Rcpp::IntegerVector> parents, const Rcpp::Nullable<Rcpp::RawVector> metadata);
539+
RcppExport SEXP _RcppTskit_rtsk_individual_table_add_row(SEXP tcSEXP, SEXP flagsSEXP, SEXP locationSEXP, SEXP parentsSEXP, SEXP metadataSEXP) {
540+
BEGIN_RCPP
541+
Rcpp::RObject rcpp_result_gen;
542+
Rcpp::RNGScope rcpp_rngScope_gen;
543+
Rcpp::traits::input_parameter< const SEXP >::type tc(tcSEXP);
544+
Rcpp::traits::input_parameter< const int >::type flags(flagsSEXP);
545+
Rcpp::traits::input_parameter< const Rcpp::Nullable<Rcpp::NumericVector> >::type location(locationSEXP);
546+
Rcpp::traits::input_parameter< const Rcpp::Nullable<Rcpp::IntegerVector> >::type parents(parentsSEXP);
547+
Rcpp::traits::input_parameter< const Rcpp::Nullable<Rcpp::RawVector> >::type metadata(metadataSEXP);
548+
rcpp_result_gen = Rcpp::wrap(rtsk_individual_table_add_row(tc, flags, location, parents, metadata));
549+
return rcpp_result_gen;
550+
END_RCPP
551+
}
537552
// test_tsk_bug_assert_c
538553
void test_tsk_bug_assert_c();
539554
RcppExport SEXP _RcppTskit_test_tsk_bug_assert_c() {
@@ -612,6 +627,16 @@ BEGIN_RCPP
612627
return R_NilValue;
613628
END_RCPP
614629
}
630+
// test_rtsk_individual_table_add_row_forced_error
631+
void test_rtsk_individual_table_add_row_forced_error(const SEXP tc);
632+
RcppExport SEXP _RcppTskit_test_rtsk_individual_table_add_row_forced_error(SEXP tcSEXP) {
633+
BEGIN_RCPP
634+
Rcpp::RNGScope rcpp_rngScope_gen;
635+
Rcpp::traits::input_parameter< const SEXP >::type tc(tcSEXP);
636+
test_rtsk_individual_table_add_row_forced_error(tc);
637+
return R_NilValue;
638+
END_RCPP
639+
}
615640

616641
static const R_CallMethodDef CallEntries[] = {
617642
{"_RcppTskit_test_validate_options", (DL_FUNC) &_RcppTskit_test_validate_options, 2},
@@ -661,6 +686,7 @@ static const R_CallMethodDef CallEntries[] = {
661686
{"_RcppTskit_rtsk_table_collection_drop_index", (DL_FUNC) &_RcppTskit_rtsk_table_collection_drop_index, 2},
662687
{"_RcppTskit_rtsk_table_collection_summary", (DL_FUNC) &_RcppTskit_rtsk_table_collection_summary, 1},
663688
{"_RcppTskit_rtsk_table_collection_metadata_length", (DL_FUNC) &_RcppTskit_rtsk_table_collection_metadata_length, 1},
689+
{"_RcppTskit_rtsk_individual_table_add_row", (DL_FUNC) &_RcppTskit_rtsk_individual_table_add_row, 5},
664690
{"_RcppTskit_test_tsk_bug_assert_c", (DL_FUNC) &_RcppTskit_test_tsk_bug_assert_c, 0},
665691
{"_RcppTskit_test_tsk_bug_assert_cpp", (DL_FUNC) &_RcppTskit_test_tsk_bug_assert_cpp, 0},
666692
{"_RcppTskit_test_tsk_trace_error_c", (DL_FUNC) &_RcppTskit_test_tsk_trace_error_c, 0},
@@ -669,6 +695,7 @@ static const R_CallMethodDef CallEntries[] = {
669695
{"_RcppTskit_test_rtsk_treeseq_copy_tables_forced_error", (DL_FUNC) &_RcppTskit_test_rtsk_treeseq_copy_tables_forced_error, 1},
670696
{"_RcppTskit_test_rtsk_treeseq_init_forced_error", (DL_FUNC) &_RcppTskit_test_rtsk_treeseq_init_forced_error, 1},
671697
{"_RcppTskit_test_rtsk_table_collection_build_index_forced_error", (DL_FUNC) &_RcppTskit_test_rtsk_table_collection_build_index_forced_error, 1},
698+
{"_RcppTskit_test_rtsk_individual_table_add_row_forced_error", (DL_FUNC) &_RcppTskit_test_rtsk_individual_table_add_row_forced_error, 1},
672699
{NULL, NULL, 0}
673700
};
674701

0 commit comments

Comments
 (0)