Field of matrices being returned with class `matrix` instead of `list`

Open
#263 3 comments 2 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
35/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Stale
Tech stack
cpp, r
Domain
data

Research direction

Start by running the supplied RcppArmadillo reproducer and compare class(), typeof(), dim(), and str() for the arma::fieldarma::cube result. Trace the exporter path for arma::field and determine why the returned list receives matrix dimensions; done means the field is a list without dimensions while the contained cubes retain their array structure.

Written by the indexing model from the issue text.

Description

enhancement help wanted

Stumbled across an interesting hiccup in the exporter for arma::field<T> (the generic vector). In particular, the attributes associated with an arma::field<arma::mat> shows as matrix under a class(x) call instead of list. The only way to obtain the list type is to use a typeof() call.

#include<RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
Rcpp::List test_case() {
  
  // Random dimensions
  int N = 5,
      P = 8,
      J = 10,
      K = 3,
      S = 2;

  // Create a 2d matrix
  arma::mat standard_2d_matrix(P, N);

  // Create a 3rd array
  arma::cube standard_3d_array(J, S, N);
  
  // Create a 4D Array
  arma::field<arma::cube> nonstandard_4d_array(N);
  
  // Fill it with cubes
  nonstandard_4d_array.fill(arma::ones<arma::cube>(J, K, S));
  
  return Rcpp::List::create(
    Rcpp::Named("d2", standard_2d_matrix),
    Rcpp::Named("d3", standard_3d_array),
    Rcpp::Named("d4", nonstandard_4d_array)
  );

}

The class issue is shown under d4 being matrix instead of list.

exporter_check = test_case() 

sapply(exporter_check, FUN = class)
#       d2       d3       d4 
# "matrix"  "array" "matrix" 
sapply(exporter_check, FUN = typeof)
#      d2       d3       d4 
# "double" "double"   "list" 

Moreover, the list is registering as a matrix with dim(x) of N x 1 instead of a list without dimensions.

sapply(exporter_check, FUN = dim)
# $d2
# [1] 8 5
# $d3
# [1] 10  2  5
# $d4
# [1] 5 1

And the object structure:

str(exporter_check)
# List of 3
# $ d2: num [1:8, 1:5] 1.49e-154 1.49e-154 2.57e-322 6.95e-310 6.95e-310 ...
# $ d3: num [1:10, 1:2, 1:5] 1.49e-154 1.49e-154 9.96e-320 1.63e-322 1.43e-322 ...
# $ d4:List of 5
#  ..$ : num [1:10, 1:3, 1:2] 1 1 1 1 1 1 1 1 1 1 ...
#  ..$ : num [1:10, 1:3, 1:2] 1 1 1 1 1 1 1 1 1 1 ...
#  ..$ : num [1:10, 1:3, 1:2] 1 1 1 1 1 1 1 1 1 1 ...
#  ..$ : num [1:10, 1:3, 1:2] 1 1 1 1 1 1 1 1 1 1 ...
#  ..$ : num [1:10, 1:3, 1:2] 1 1 1 1 1 1 1 1 1 1 ...
#  ..- attr(*, "dim")= int [1:2] 5 1
Dominant language
C++
Stars
211
Forks
54
Avg merge
5m
Merged PRs (30d)
1

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from RcppCore/RcppArmadillo

All issues in RcppCore/RcppArmadillo

Similar issues

More C++ issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.