Skip to content

Commit 0e6345e

Browse files
committed
Port formatting from the format options PR (#382)
1 parent af0c393 commit 0e6345e

File tree

2 files changed

+58
-23
lines changed

2 files changed

+58
-23
lines changed

crates/ark/src/data_explorer/r_data_explorer.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,7 @@ use harp::tbl_get_column;
5959
use harp::utils::r_inherits;
6060
use harp::utils::r_is_object;
6161
use harp::utils::r_is_s4;
62-
use harp::utils::r_names2;
6362
use harp::utils::r_typeof;
64-
use harp::vector::CharacterVector;
65-
use harp::vector::Vector;
6663
use harp::TableInfo;
6764
use harp::TableKind;
6865
use libr::*;
@@ -76,7 +73,6 @@ use uuid::Uuid;
7673

7774
use crate::data_explorer::export_selection;
7875
use crate::data_explorer::format;
79-
use crate::data_explorer::format::format_string;
8076
use crate::data_explorer::summary_stats::summary_stats;
8177
use crate::interface::RMain;
8278
use crate::lsp::events::EVENTS;
@@ -678,7 +674,7 @@ impl RDataExplorer {
678674
None => column,
679675
};
680676

681-
Ok(summary_stats(filtered_column.sexp, dtype))
677+
Ok(summary_stats(filtered_column.sexp, dtype, format_options))
682678
}
683679

684680
/// Sort the rows of the data object according to the sort keys in

crates/ark/src/data_explorer/summary_stats.rs

+57-18
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,29 @@ use std::collections::HashMap;
1010
use amalthea::comm::data_explorer_comm;
1111
use amalthea::comm::data_explorer_comm::ColumnDisplayType;
1212
use amalthea::comm::data_explorer_comm::ColumnSummaryStats;
13+
use amalthea::comm::data_explorer_comm::FormatOptions;
1314
use harp::exec::RFunction;
1415
use harp::exec::RFunctionExt;
1516
use harp::object::RObject;
17+
use harp::utils::r_names2;
18+
use harp::vector::CharacterVector;
19+
use harp::vector::Vector;
1620
use libr::SEXP;
1721
use stdext::unwrap;
1822

23+
use crate::data_explorer::format::format_string;
1924
use crate::modules::ARK_ENVS;
2025

21-
pub fn summary_stats(column: SEXP, display_type: ColumnDisplayType) -> ColumnSummaryStats {
22-
match summary_stats_(column, display_type) {
26+
pub fn summary_stats(
27+
column: SEXP,
28+
display_type: ColumnDisplayType,
29+
format_options: &FormatOptions,
30+
) -> ColumnSummaryStats {
31+
match summary_stats_(column, display_type, format_options) {
2332
Ok(stats) => stats,
2433
Err(e) => {
25-
// we want to log the error but return an empty summary stats so
26-
// that the user can still see the rest of the data
34+
// We want to log the error but return an empty summary stats so
35+
// that the user can still see the rest of the data.
2736
log::error!("Error getting summary stats: {:?}", e);
2837
empty_column_summary_stats()
2938
},
@@ -33,9 +42,10 @@ pub fn summary_stats(column: SEXP, display_type: ColumnDisplayType) -> ColumnSum
3342
fn summary_stats_(
3443
column: SEXP,
3544
display_type: ColumnDisplayType,
45+
format_options: &FormatOptions,
3646
) -> anyhow::Result<ColumnSummaryStats> {
3747
match display_type {
38-
ColumnDisplayType::Number => Ok(summary_stats_number(column)?.into()),
48+
ColumnDisplayType::Number => Ok(summary_stats_number(column, format_options)?.into()),
3949
ColumnDisplayType::String => Ok(summary_stats_string(column)?.into()),
4050
ColumnDisplayType::Boolean => Ok(summary_stats_boolean(column)?.into()),
4151
ColumnDisplayType::Date => Ok(summary_stats_date(column)?.into()),
@@ -44,9 +54,23 @@ fn summary_stats_(
4454
}
4555
}
4656

47-
fn summary_stats_number(column: SEXP) -> anyhow::Result<SummaryStatsNumber> {
48-
let stats = call_summary_fn("summary_stats_number", column)?;
49-
let r_stats: HashMap<String, String> = stats.try_into()?;
57+
fn summary_stats_number(
58+
column: SEXP,
59+
format_options: &FormatOptions,
60+
) -> anyhow::Result<SummaryStatsNumber> {
61+
let r_stats = call_summary_fn("summary_stats_number", column)?;
62+
63+
let names = unsafe { CharacterVector::new_unchecked(r_names2(r_stats.sexp)) };
64+
let values = format_string(r_stats.sexp, format_options);
65+
66+
let r_stats: HashMap<String, String> = names
67+
.iter()
68+
.zip(values.into_iter())
69+
.map(|(name, value)| match name {
70+
Some(name) => (name, value),
71+
None => ("unk".to_string(), value),
72+
})
73+
.collect();
5074

5175
Ok(SummaryStatsNumber(data_explorer_comm::SummaryStatsNumber {
5276
min_value: r_stats["min_value"].clone(),
@@ -204,18 +228,28 @@ mod tests {
204228
use super::*;
205229
use crate::test::r_test;
206230

231+
fn default_options() -> FormatOptions {
232+
FormatOptions {
233+
large_num_digits: 2,
234+
small_num_digits: 4,
235+
max_integral_digits: 7,
236+
thousands_sep: Some(",".to_string()),
237+
}
238+
}
239+
207240
#[test]
208241
fn test_numeric_summary() {
209242
r_test(|| {
210243
let column = r_parse_eval0("c(1,2,3,4,5, NA)", R_ENVS.global).unwrap();
211-
let stats = summary_stats_(column.sexp, ColumnDisplayType::Number).unwrap();
244+
let stats =
245+
summary_stats_(column.sexp, ColumnDisplayType::Number, &default_options()).unwrap();
212246
let expected: ColumnSummaryStats =
213247
SummaryStatsNumber(data_explorer_comm::SummaryStatsNumber {
214-
min_value: "1.000000".to_string(),
215-
max_value: "5.000000".to_string(),
216-
mean: "3.000000".to_string(),
217-
median: "3.000000".to_string(),
218-
stdev: "1.581139".to_string(),
248+
min_value: "1.00".to_string(),
249+
max_value: "5.00".to_string(),
250+
mean: "3.00".to_string(),
251+
median: "3.00".to_string(),
252+
stdev: "1.58".to_string(),
219253
})
220254
.into();
221255
assert_eq!(stats, expected);
@@ -226,7 +260,8 @@ mod tests {
226260
fn test_string_summary() {
227261
r_test(|| {
228262
let column = r_parse_eval0("c('a', 'b', 'c', 'd', '')", R_ENVS.global).unwrap();
229-
let stats = summary_stats_(column.sexp, ColumnDisplayType::String).unwrap();
263+
let stats =
264+
summary_stats_(column.sexp, ColumnDisplayType::String, &default_options()).unwrap();
230265
let expected: ColumnSummaryStats =
231266
SummaryStatsString(data_explorer_comm::SummaryStatsString {
232267
num_empty: 1,
@@ -241,7 +276,8 @@ mod tests {
241276
fn test_boolean_summary() {
242277
r_test(|| {
243278
let column = r_parse_eval0("c(TRUE, FALSE, TRUE, TRUE, NA)", R_ENVS.global).unwrap();
244-
let stats = summary_stats_(column.sexp, ColumnDisplayType::Boolean).unwrap();
279+
let stats = summary_stats_(column.sexp, ColumnDisplayType::Boolean, &default_options())
280+
.unwrap();
245281
let expected: ColumnSummaryStats =
246282
SummaryStatsBoolean(data_explorer_comm::SummaryStatsBoolean {
247283
true_count: 3,
@@ -260,7 +296,8 @@ mod tests {
260296
R_ENVS.global,
261297
)
262298
.unwrap();
263-
let stats = summary_stats_(column.sexp, ColumnDisplayType::Date).unwrap();
299+
let stats =
300+
summary_stats_(column.sexp, ColumnDisplayType::Date, &default_options()).unwrap();
264301
let expected: ColumnSummaryStats =
265302
SummaryStatsDate(data_explorer_comm::SummaryStatsDate {
266303
min_date: "2021-01-01".to_string(),
@@ -282,7 +319,9 @@ mod tests {
282319
R_ENVS.global,
283320
)
284321
.unwrap();
285-
let stats = summary_stats_(column.sexp, ColumnDisplayType::Datetime).unwrap();
322+
let stats =
323+
summary_stats_(column.sexp, ColumnDisplayType::Datetime, &default_options())
324+
.unwrap();
286325
let expected: ColumnSummaryStats =
287326
SummaryStatsDatetime(data_explorer_comm::SummaryStatsDatetime {
288327
num_unique: 2,

0 commit comments

Comments
 (0)