diff --git a/README.md b/README.md index ca66c2e..e6fba15 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,9 @@ Situs: https://lambda.fiako.engineering Koleksi dan portal informasi lambda oleh FIAKO Engineering Repository: [fiakoenjiniring/feidlambda](https://github.com/fiakoenjiniring/feidlambda) + +## QUARTO FILTER + +_Filter_ yang digunakan di website (quarto): + +- `include-code-files.lua` yang diperoleh dari [pandoc/lua-filters](https://github.com/pandoc/lua-filters/tree/master/include-code-files) dengan [MIT LICENSE](https://github.com/pandoc/lua-filters/blob/master/LICENSE), \ No newline at end of file diff --git a/_feidlambda/feid b/_feidlambda/feid index 469710d..61bfaea 100644 --- a/_feidlambda/feid +++ b/_feidlambda/feid @@ -1,9 +1,9 @@ /* -feidlambda v0.3.0 - LOGIC / UTILITIES FUNCTIONS BY FIAKO ENGINEERING -GIST feidlambda v0.3.0: https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12 +feidlambda v0.3.1 - LOGIC / UTILITIES FUNCTIONS BY FIAKO ENGINEERING +OFFICIAL GIST (feidlambda v0.3.x): https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12 REPOSITORY: https://github.com/fiakoenjiniring/feidlambda AUTHOR: @taruma -TESTED: Microsoft Excel v2211 (Build 16.0.15831.20098) +TESTED: Microsoft Excel v2211 */ /* @@ -35,38 +35,69 @@ FILTER_DROP_COLUMNS = LAMBDA(array, column_index, ); // NONE --> FILTER_FUNC_COLUMN -FILTER_FUNC_COLUMN = LAMBDA(array, [col], [label_col], [with_label], [function], [label_function], +FILTER_FUNC_COLUMN = LAMBDA( + array, + [column_index], + [with_label], + [label_col], + [function], + [label_function], + [take_first_only], LET( - col, IF(ISOMITTED(col), 1, col), - label_col, IF(ISOMITTED(label_col), col, label_col), + take_first_only, IF(ISOMITTED(take_first_only), FALSE, take_first_only), + column_index, IF(ISOMITTED(column_index), 1, column_index), + label_col, IF(ISOMITTED(label_col), column_index, label_col), with_label, IF(ISOMITTED(with_label), FALSE, with_label), function, IF(ISOMITTED(function), LAMBDA(x, MAX(x)), function), label_function, IF(ISOMITTED(label_function), "func", label_function), - selected_vector, CHOOSECOLS(array, col), + selected_vector, CHOOSECOLS(array, column_index), func_value, function(selected_vector), selected_logical, selected_vector = func_value, - array_max, FILTER(array, selected_logical), - label, MAKEARRAY(ROWS(array_max), 1, LAMBDA(x, y, CONCAT(label_col, "_", label_function))), - IF(with_label, HSTACK(label, array_max), array_max) + array_filter, FILTER(array, selected_logical), + array_func, IF(take_first_only, TAKE(array_filter, 1), array_filter), + label, MAKEARRAY(ROWS(array_func), 1, LAMBDA(x, y, CONCAT(label_col, "_", label_function))), + IF(with_label, HSTACK(label, array_func), array_func) ) ); // FILTER_FUNC_COLUMN --> FILTER_MINMAX_COLUMN -FILTER_MINMAX_COLUMN = LAMBDA(array, [col], [label_col], [with_label], +FILTER_MINMAX_COLUMN = LAMBDA(array, [column_index], [with_label], [label_col], [take_first_only], LET( func_1, LAMBDA(x, MIN(x)), label_func_1, "min", func_2, LAMBDA(x, MAX(x)), label_func_2, "max", - func1_result, FILTER_FUNC_COLUMN(array, col, label_col, with_label, func_1, label_func_1), - func2_result, FILTER_FUNC_COLUMN(array, col, label_col, with_label, func_2, label_func_2), + func1_result, FILTER_FUNC_COLUMN( + array, + column_index, + with_label, + label_col, + func_1, + label_func_1, + take_first_only + ), + func2_result, FILTER_FUNC_COLUMN( + array, + column_index, + with_label, + label_col, + func_2, + label_func_2, + take_first_only + ), VSTACK(func1_result, func2_result) ) ); // FILTER_MINMAX_COLUMN --> _RECURSIVE_FILTER_MINMAX // _RECURSIVE_FILTER_MINMAX --> _RECURSIVE_FILTER_MINMAX -_RECURSIVE_FILTER_MINMAX = LAMBDA(array, ntry, [ignore_first_column], [label_vector], [with_label], +_RECURSIVE_FILTER_MINMAX = LAMBDA( + array, + ntry, + [ignore_first_column], + [with_label], + [label_vector], + [take_first_only], LET( ignore_first_column, IF(ISOMITTED(ignore_first_column), FALSE, ignore_first_column), stop_col, IF(ignore_first_column, 2, 1), @@ -75,17 +106,18 @@ _RECURSIVE_FILTER_MINMAX = LAMBDA(array, ntry, [ignore_first_column], [label_vec label_col, CHOOSECOLS(new_label, ntry), IF( ntry = stop_col, - FILTER_MINMAX_COLUMN(array, ntry, label_col, with_label), + FILTER_MINMAX_COLUMN(array, ntry, with_label, label_col, take_first_only), LET( - results, FILTER_MINMAX_COLUMN(array, ntry, label_col, with_label), + results, FILTER_MINMAX_COLUMN(array, ntry, with_label, label_col, take_first_only), next_try, ntry - 1, VSTACK( _RECURSIVE_FILTER_MINMAX( array, next_try, ignore_first_column, + with_label, label_vector, - with_label + take_first_only ), results ) @@ -95,8 +127,15 @@ _RECURSIVE_FILTER_MINMAX = LAMBDA(array, ntry, [ignore_first_column], [label_vec ); // _RECURSIVE_FILTER_MINMAX --> FILTER_MINMAX_ARRAY -FILTER_MINMAX_ARRAY = LAMBDA(array, [ignore_first_column], [with_labels], [label_vector], - _RECURSIVE_FILTER_MINMAX(array, COLUMNS(array), ignore_first_column, label_vector, with_labels) +FILTER_MINMAX_ARRAY = LAMBDA(array, [ignore_first_column], [with_label], [label_vector], [take_first_only], + _RECURSIVE_FILTER_MINMAX( + array, + COLUMNS(array), + ignore_first_column, + with_label, + label_vector, + take_first_only + ) ); /* @@ -104,9 +143,9 @@ FILTER_MINMAX_ARRAY = LAMBDA(array, [ignore_first_column], [with_labels], [label */ // NONE --> GET_INDEX_2D -GET_INDEX_2D = LAMBDA(lookup_value, array, [return_order_only], +GET_INDEX_2D = LAMBDA(lookup_value, array, [return_as_order], LET( - return_order_only, IF(ISOMITTED(return_order_only), FALSE, return_order_only), + return_as_order, IF(ISOMITTED(return_as_order), FALSE, return_as_order), nrows, ROWS(array), ncols, COLUMNS(array), size, nrows * ncols, @@ -119,7 +158,7 @@ GET_INDEX_2D = LAMBDA(lookup_value, array, [return_order_only], index_flatten, TOCOL(index_sequence, , TRUE), lookup_table, HSTACK(index_flatten, rows_flatten, columns_flatten), lookup_result, FILTER(lookup_table, array_flatten = lookup_value), - IF(return_order_only, CHOOSECOLS(lookup_result, 1), lookup_result) + IF(return_as_order, CHOOSECOLS(lookup_result, 1), lookup_result) ) ); @@ -197,21 +236,11 @@ _RECURSIVE_MAKE_SEQUENCE = LAMBDA(start_vector, end_vector, ntry, [stack_horizon IF( stack_horizontally, HSTACK( - _RECURSIVE_MAKE_SEQUENCE( - start_vector, - end_vector, - next_try, - stack_horizontally - ), + _RECURSIVE_MAKE_SEQUENCE(start_vector, end_vector, next_try, stack_horizontally), results ), VSTACK( - _RECURSIVE_MAKE_SEQUENCE( - start_vector, - end_vector, - next_try, - stack_horizontally - ), + _RECURSIVE_MAKE_SEQUENCE(start_vector, end_vector, next_try, stack_horizontally), results ) ) @@ -234,11 +263,7 @@ REPEAT_ARRAY = LAMBDA(array, [num_repeat], [by_row], LET( by_row, IF(ISOMITTED(by_row), TRUE, by_row), num_repeat, IF(ISOMITTED(num_repeat), 2, num_repeat), - IF( - by_row, - REPEAT_ARRAY_BY_ROW(array, num_repeat), - REPEAT_ARRAY_BY_COLUMN(array, num_repeat) - ) + IF(by_row, REPEAT_ARRAY_BY_ROW(array, num_repeat), REPEAT_ARRAY_BY_COLUMN(array, num_repeat)) ) ); @@ -261,10 +286,7 @@ REPEAT_ARRAY_BY_COLUMN = LAMBDA(array, [num_repeat], IF( num_repeat = 1, array, - LET( - next_repeat, num_repeat - 1, - HSTACK(REPEAT_ARRAY_BY_COLUMN(array, next_repeat), array) - ) + LET(next_repeat, num_repeat - 1, HSTACK(REPEAT_ARRAY_BY_COLUMN(array, next_repeat), array)) ) ) ); @@ -291,7 +313,7 @@ RESHAPE_BY_COLUMNS = LAMBDA(array, [num_split], array_sorted, SORTBY(array_flatten, divider_repeat_col), WRAPROWS(array_sorted, num_split) ), - "#INVALID_NUM_SPLIT" + NA() ) ) ); @@ -301,16 +323,16 @@ RESHAPE_BY_COLUMNS = LAMBDA(array, [num_split], */ // NONE --> ROTATE_VECTOR -ROTATE_VECTOR = LAMBDA(vector, n, [as_column_vector], +ROTATE_VECTOR = LAMBDA(vector, num_rotation, [as_column_vector], LET( vector, TOCOL(vector), rotated_array, IFS( - OR(n = 0, n >= ROWS(vector), n <= -ROWS(vector)), + OR(num_rotation = 0, num_rotation >= ROWS(vector), num_rotation <= -ROWS(vector)), vector, - n > 0, - VSTACK(DROP(vector, n), TAKE(vector, n)), - n < 0, - VSTACK(TAKE(vector, n), DROP(vector, n)) + num_rotation > 0, + VSTACK(DROP(vector, num_rotation), TAKE(vector, num_rotation)), + num_rotation < 0, + VSTACK(TAKE(vector, num_rotation), DROP(vector, num_rotation)) ), as_column_vector, IF(ISOMITTED(as_column_vector), FALSE, TRUE), IF(as_column_vector, TOROW(rotated_array), TOCOL(rotated_array)) @@ -318,7 +340,7 @@ ROTATE_VECTOR = LAMBDA(vector, n, [as_column_vector], ); // ROTATE_VECTOR --> ROTATE_ARRAY -ROTATE_ARRAY = LAMBDA(array, n, [rotate_columns], +ROTATE_ARRAY = LAMBDA(array, num_rotation, [rotate_columns], LET( rotate_columns, IF(ISOMITTED(rotate_columns), TRUE, FALSE), nrows, ROWS(array), @@ -327,8 +349,8 @@ ROTATE_ARRAY = LAMBDA(array, n, [rotate_columns], seqcols, SEQUENCE(1, ncols), results, IF( rotate_columns, - CHOOSECOLS(array, ROTATE_VECTOR(seqcols, n, TRUE)), - CHOOSEROWS(array, ROTATE_VECTOR(seqrows, n, FALSE)) + CHOOSECOLS(array, ROTATE_VECTOR(seqcols, num_rotation, TRUE)), + CHOOSEROWS(array, ROTATE_VECTOR(seqrows, num_rotation, FALSE)) ), results ) @@ -341,13 +363,16 @@ ROTATE_ARRAY = LAMBDA(array, n, [rotate_columns], // NONE --> SWAP_COLUMNS SWAP_COLUMNS = LAMBDA(array, [from_index], [to_index], LET( + ncols, COLUMNS(array), from_index, IF(ISOMITTED(from_index), 1, from_index), - to_index, IF(ISOMITTED(to_index), 2, to_index), + to_index, IF(ISOMITTED(to_index), -1, to_index), + from_value, IF(from_index < 0, from_index + ncols + 1, from_index), + to_value, IF(to_index < 0, to_index + ncols + 1, to_index), column_sequence, SEQUENCE(1, COLUMNS(array)), - from_logical, column_sequence = from_index, - to_logical, column_sequence = to_index, - replace_from, IF(from_logical, to_index, column_sequence), - replace_to, IF(to_logical, from_index, replace_from), + from_logical, column_sequence = from_value, + to_logical, column_sequence = to_value, + replace_from, IF(from_logical, to_value, column_sequence), + replace_to, IF(to_logical, from_value, replace_from), CHOOSECOLS(array, replace_to) ) ); @@ -355,13 +380,16 @@ SWAP_COLUMNS = LAMBDA(array, [from_index], [to_index], // NONE --> SWAP_ROWS SWAP_ROWS = LAMBDA(array, [from_index], [to_index], LET( + nrows, ROWS(array), from_index, IF(ISOMITTED(from_index), 1, from_index), - to_index, IF(ISOMITTED(to_index), 2, to_index), + to_index, IF(ISOMITTED(to_index), -1, to_index), + from_value, IF(from_index < 0, from_index + nrows + 1, from_index), + to_value, IF(to_index < 0, to_index + nrows + 1, to_index), row_sequence, SEQUENCE(ROWS(array)), - from_logical, row_sequence = from_index, - to_logical, row_sequence = to_index, - replace_from, IF(from_logical, to_index, row_sequence), - replace_to, IF(to_logical, from_index, replace_from), + from_logical, row_sequence = from_value, + to_logical, row_sequence = to_value, + replace_from, IF(from_logical, to_value, row_sequence), + replace_to, IF(to_logical, from_value, replace_from), CHOOSEROWS(array, replace_to) ) ); @@ -370,20 +398,72 @@ SWAP_ROWS = LAMBDA(array, [from_index], [to_index], ---- TEXT ---- */ -// NONE --> TEXT_SPLIT_VECTOR +// _RECURSIVE_TEXT_SPLIT --> _RECURSIVE_TEXT_SPLIT +_RECURSIVE_TEXT_SPLIT = LAMBDA( + text_vector, + ntry, + col_delimiter, + [row_delimiter], + [ignore_empty], + [match_mode], + [pad_with], + LET( + text_vector, TOCOL(text_vector), + selected_row, ARRAYTOTEXT(INDEX(text_vector, ntry)), + IF( + ntry = 1, + TEXTSPLIT(selected_row, col_delimiter, row_delimiter, ignore_empty, match_mode, pad_with), + LET( + next_try, ntry - 1, + results, TEXTSPLIT( + selected_row, + col_delimiter, + row_delimiter, + ignore_empty, + match_mode, + pad_with + ), + VSTACK( + _RECURSIVE_TEXT_SPLIT( + text_vector, + next_try, + col_delimiter, + row_delimiter, + ignore_empty, + match_mode, + pad_with + ), + results + ) + ) + ) + ) +); + +// _RECURSIVE_TEXT_SPLIT --> TEXT_SPLIT_VECTOR TEXT_SPLIT_VECTOR = LAMBDA( text_vector, - [text_delimiter], + [col_delimiter], [row_delimiter], [ignore_empty], [match_mode], [pad_with], + [replace_na], LET( - text_delimiter, IF(ISOMITTED(text_delimiter), " ", text_delimiter), - row_delimiter, IF(ISOMITTED(row_delimiter), "|<#>|", row_delimiter), + nrows, ROWS(text_vector), + col_delimiter, IF(ISOMITTED(col_delimiter), " ", col_delimiter), + replace_na, IF(ISOMITTED(replace_na), NA(), replace_na), pad_with, IF(ISOMITTED(pad_with), "", pad_with), - reduce_text, REDUCE(, text_vector, LAMBDA(acc, curr, CONCAT(acc, row_delimiter, curr))), - TEXTSPLIT(reduce_text, text_delimiter, row_delimiter, ignore_empty, match_mode, pad_with) + result, _RECURSIVE_TEXT_SPLIT( + text_vector, + nrows, + col_delimiter, + row_delimiter, + ignore_empty, + match_mode, + pad_with + ), + IFERROR(result, replace_na) ) ); diff --git a/_feidlambda/feid_FILTER b/_feidlambda/feid_FILTER index d86bdff..6b8edfb 100644 --- a/_feidlambda/feid_FILTER +++ b/_feidlambda/feid_FILTER @@ -23,38 +23,69 @@ FILTER_DROP_COLUMNS = LAMBDA(array, column_index, ); // NONE --> FILTER_FUNC_COLUMN -FILTER_FUNC_COLUMN = LAMBDA(array, [col], [label_col], [with_label], [function], [label_function], +FILTER_FUNC_COLUMN = LAMBDA( + array, + [column_index], + [with_label], + [label_col], + [function], + [label_function], + [take_first_only], LET( - col, IF(ISOMITTED(col), 1, col), - label_col, IF(ISOMITTED(label_col), col, label_col), + take_first_only, IF(ISOMITTED(take_first_only), FALSE, take_first_only), + column_index, IF(ISOMITTED(column_index), 1, column_index), + label_col, IF(ISOMITTED(label_col), column_index, label_col), with_label, IF(ISOMITTED(with_label), FALSE, with_label), function, IF(ISOMITTED(function), LAMBDA(x, MAX(x)), function), label_function, IF(ISOMITTED(label_function), "func", label_function), - selected_vector, CHOOSECOLS(array, col), + selected_vector, CHOOSECOLS(array, column_index), func_value, function(selected_vector), selected_logical, selected_vector = func_value, - array_max, FILTER(array, selected_logical), - label, MAKEARRAY(ROWS(array_max), 1, LAMBDA(x, y, CONCAT(label_col, "_", label_function))), - IF(with_label, HSTACK(label, array_max), array_max) + array_filter, FILTER(array, selected_logical), + array_func, IF(take_first_only, TAKE(array_filter, 1), array_filter), + label, MAKEARRAY(ROWS(array_func), 1, LAMBDA(x, y, CONCAT(label_col, "_", label_function))), + IF(with_label, HSTACK(label, array_func), array_func) ) ); // FILTER_FUNC_COLUMN --> FILTER_MINMAX_COLUMN -FILTER_MINMAX_COLUMN = LAMBDA(array, [col], [label_col], [with_label], +FILTER_MINMAX_COLUMN = LAMBDA(array, [column_index], [with_label], [label_col], [take_first_only], LET( func_1, LAMBDA(x, MIN(x)), label_func_1, "min", func_2, LAMBDA(x, MAX(x)), label_func_2, "max", - func1_result, FILTER_FUNC_COLUMN(array, col, label_col, with_label, func_1, label_func_1), - func2_result, FILTER_FUNC_COLUMN(array, col, label_col, with_label, func_2, label_func_2), + func1_result, FILTER_FUNC_COLUMN( + array, + column_index, + with_label, + label_col, + func_1, + label_func_1, + take_first_only + ), + func2_result, FILTER_FUNC_COLUMN( + array, + column_index, + with_label, + label_col, + func_2, + label_func_2, + take_first_only + ), VSTACK(func1_result, func2_result) ) ); // FILTER_MINMAX_COLUMN --> _RECURSIVE_FILTER_MINMAX // _RECURSIVE_FILTER_MINMAX --> _RECURSIVE_FILTER_MINMAX -_RECURSIVE_FILTER_MINMAX = LAMBDA(array, ntry, [ignore_first_column], [label_vector], [with_label], +_RECURSIVE_FILTER_MINMAX = LAMBDA( + array, + ntry, + [ignore_first_column], + [with_label], + [label_vector], + [take_first_only], LET( ignore_first_column, IF(ISOMITTED(ignore_first_column), FALSE, ignore_first_column), stop_col, IF(ignore_first_column, 2, 1), @@ -63,17 +94,18 @@ _RECURSIVE_FILTER_MINMAX = LAMBDA(array, ntry, [ignore_first_column], [label_vec label_col, CHOOSECOLS(new_label, ntry), IF( ntry = stop_col, - FILTER_MINMAX_COLUMN(array, ntry, label_col, with_label), + FILTER_MINMAX_COLUMN(array, ntry, with_label, label_col, take_first_only), LET( - results, FILTER_MINMAX_COLUMN(array, ntry, label_col, with_label), + results, FILTER_MINMAX_COLUMN(array, ntry, with_label, label_col, take_first_only), next_try, ntry - 1, VSTACK( _RECURSIVE_FILTER_MINMAX( array, next_try, ignore_first_column, + with_label, label_vector, - with_label + take_first_only ), results ) @@ -83,6 +115,13 @@ _RECURSIVE_FILTER_MINMAX = LAMBDA(array, ntry, [ignore_first_column], [label_vec ); // _RECURSIVE_FILTER_MINMAX --> FILTER_MINMAX_ARRAY -FILTER_MINMAX_ARRAY = LAMBDA(array, [ignore_first_column], [with_labels], [label_vector], - _RECURSIVE_FILTER_MINMAX(array, COLUMNS(array), ignore_first_column, label_vector, with_labels) -); \ No newline at end of file +FILTER_MINMAX_ARRAY = LAMBDA(array, [ignore_first_column], [with_label], [label_vector], [take_first_only], + _RECURSIVE_FILTER_MINMAX( + array, + COLUMNS(array), + ignore_first_column, + with_label, + label_vector, + take_first_only + ) +); diff --git a/_feidlambda/feid_GET b/_feidlambda/feid_GET index 5c24d41..0046d46 100644 --- a/_feidlambda/feid_GET +++ b/_feidlambda/feid_GET @@ -1,7 +1,7 @@ // NONE --> GET_INDEX_2D -GET_INDEX_2D = LAMBDA(lookup_value, array, [return_order_only], +GET_INDEX_2D = LAMBDA(lookup_value, array, [return_as_order], LET( - return_order_only, IF(ISOMITTED(return_order_only), FALSE, return_order_only), + return_as_order, IF(ISOMITTED(return_as_order), FALSE, return_as_order), nrows, ROWS(array), ncols, COLUMNS(array), size, nrows * ncols, @@ -14,6 +14,6 @@ GET_INDEX_2D = LAMBDA(lookup_value, array, [return_order_only], index_flatten, TOCOL(index_sequence, , TRUE), lookup_table, HSTACK(index_flatten, rows_flatten, columns_flatten), lookup_result, FILTER(lookup_table, array_flatten = lookup_value), - IF(return_order_only, CHOOSECOLS(lookup_result, 1), lookup_result) + IF(return_as_order, CHOOSECOLS(lookup_result, 1), lookup_result) ) -); \ No newline at end of file +); diff --git a/_feidlambda/feid_IS b/_feidlambda/feid_IS index 2fa65a9..f9609a9 100644 --- a/_feidlambda/feid_IS +++ b/_feidlambda/feid_IS @@ -47,4 +47,4 @@ IS_COLUMNS_LOGICAL = LAMBDA(logical_array, [logical_function], logical_function, IF(ISOMITTED(logical_function), LAMBDA(x, OR(x)), logical_function), BYCOL(logical_array, LAMBDA(each_col, logical_function(each_col))) ) -); \ No newline at end of file +); diff --git a/_feidlambda/feid_MAKE b/_feidlambda/feid_MAKE index b1db5dc..bdef3be 100644 --- a/_feidlambda/feid_MAKE +++ b/_feidlambda/feid_MAKE @@ -13,21 +13,11 @@ _RECURSIVE_MAKE_SEQUENCE = LAMBDA(start_vector, end_vector, ntry, [stack_horizon IF( stack_horizontally, HSTACK( - _RECURSIVE_MAKE_SEQUENCE( - start_vector, - end_vector, - next_try, - stack_horizontally - ), + _RECURSIVE_MAKE_SEQUENCE(start_vector, end_vector, next_try, stack_horizontally), results ), VSTACK( - _RECURSIVE_MAKE_SEQUENCE( - start_vector, - end_vector, - next_try, - stack_horizontally - ), + _RECURSIVE_MAKE_SEQUENCE(start_vector, end_vector, next_try, stack_horizontally), results ) ) @@ -39,4 +29,4 @@ _RECURSIVE_MAKE_SEQUENCE = LAMBDA(start_vector, end_vector, ntry, [stack_horizon // _RECURSIVE_MAKE_SEQUENCE --> MAKE_SEQUENCE_FROM_VECTOR MAKE_SEQUENCE_FROM_VECTOR = LAMBDA(start_vector, end_vector, [stack_horizontally], _RECURSIVE_MAKE_SEQUENCE(start_vector, end_vector, ROWS(start_vector), stack_horizontally) -); \ No newline at end of file +); diff --git a/_feidlambda/feid_REPEAT b/_feidlambda/feid_REPEAT index 2bc9541..621c0ee 100644 --- a/_feidlambda/feid_REPEAT +++ b/_feidlambda/feid_REPEAT @@ -3,11 +3,7 @@ REPEAT_ARRAY = LAMBDA(array, [num_repeat], [by_row], LET( by_row, IF(ISOMITTED(by_row), TRUE, by_row), num_repeat, IF(ISOMITTED(num_repeat), 2, num_repeat), - IF( - by_row, - REPEAT_ARRAY_BY_ROW(array, num_repeat), - REPEAT_ARRAY_BY_COLUMN(array, num_repeat) - ) + IF(by_row, REPEAT_ARRAY_BY_ROW(array, num_repeat), REPEAT_ARRAY_BY_COLUMN(array, num_repeat)) ) ); @@ -30,10 +26,7 @@ REPEAT_ARRAY_BY_COLUMN = LAMBDA(array, [num_repeat], IF( num_repeat = 1, array, - LET( - next_repeat, num_repeat - 1, - HSTACK(REPEAT_ARRAY_BY_COLUMN(array, next_repeat), array) - ) + LET(next_repeat, num_repeat - 1, HSTACK(REPEAT_ARRAY_BY_COLUMN(array, next_repeat), array)) ) ) -); +); \ No newline at end of file diff --git a/_feidlambda/feid_RESHAPE b/_feidlambda/feid_RESHAPE index 8962928..b9afefc 100644 --- a/_feidlambda/feid_RESHAPE +++ b/_feidlambda/feid_RESHAPE @@ -16,7 +16,7 @@ RESHAPE_BY_COLUMNS = LAMBDA(array, [num_split], array_sorted, SORTBY(array_flatten, divider_repeat_col), WRAPROWS(array_sorted, num_split) ), - "#INVALID_NUM_SPLIT" + NA() ) ) -); \ No newline at end of file +); diff --git a/_feidlambda/feid_ROTATE b/_feidlambda/feid_ROTATE index 52d219d..c622d04 100644 --- a/_feidlambda/feid_ROTATE +++ b/_feidlambda/feid_ROTATE @@ -1,14 +1,14 @@ // NONE --> ROTATE_VECTOR -ROTATE_VECTOR = LAMBDA(vector, n, [as_column_vector], +ROTATE_VECTOR = LAMBDA(vector, num_rotation, [as_column_vector], LET( vector, TOCOL(vector), rotated_array, IFS( - OR(n = 0, n >= ROWS(vector), n <= -ROWS(vector)), + OR(num_rotation = 0, num_rotation >= ROWS(vector), num_rotation <= -ROWS(vector)), vector, - n > 0, - VSTACK(DROP(vector, n), TAKE(vector, n)), - n < 0, - VSTACK(TAKE(vector, n), DROP(vector, n)) + num_rotation > 0, + VSTACK(DROP(vector, num_rotation), TAKE(vector, num_rotation)), + num_rotation < 0, + VSTACK(TAKE(vector, num_rotation), DROP(vector, num_rotation)) ), as_column_vector, IF(ISOMITTED(as_column_vector), FALSE, TRUE), IF(as_column_vector, TOROW(rotated_array), TOCOL(rotated_array)) @@ -16,7 +16,7 @@ ROTATE_VECTOR = LAMBDA(vector, n, [as_column_vector], ); // ROTATE_VECTOR --> ROTATE_ARRAY -ROTATE_ARRAY = LAMBDA(array, n, [rotate_columns], +ROTATE_ARRAY = LAMBDA(array, num_rotation, [rotate_columns], LET( rotate_columns, IF(ISOMITTED(rotate_columns), TRUE, FALSE), nrows, ROWS(array), @@ -25,9 +25,9 @@ ROTATE_ARRAY = LAMBDA(array, n, [rotate_columns], seqcols, SEQUENCE(1, ncols), results, IF( rotate_columns, - CHOOSECOLS(array, ROTATE_VECTOR(seqcols, n, TRUE)), - CHOOSEROWS(array, ROTATE_VECTOR(seqrows, n, FALSE)) + CHOOSECOLS(array, ROTATE_VECTOR(seqcols, num_rotation, TRUE)), + CHOOSEROWS(array, ROTATE_VECTOR(seqrows, num_rotation, FALSE)) ), results ) -); \ No newline at end of file +); diff --git a/_feidlambda/feid_SWAP b/_feidlambda/feid_SWAP index 5434d22..09f9e09 100644 --- a/_feidlambda/feid_SWAP +++ b/_feidlambda/feid_SWAP @@ -1,13 +1,16 @@ // NONE --> SWAP_COLUMNS SWAP_COLUMNS = LAMBDA(array, [from_index], [to_index], LET( + ncols, COLUMNS(array), from_index, IF(ISOMITTED(from_index), 1, from_index), - to_index, IF(ISOMITTED(to_index), 2, to_index), + to_index, IF(ISOMITTED(to_index), -1, to_index), + from_value, IF(from_index < 0, from_index + ncols + 1, from_index), + to_value, IF(to_index < 0, to_index + ncols + 1, to_index), column_sequence, SEQUENCE(1, COLUMNS(array)), - from_logical, column_sequence = from_index, - to_logical, column_sequence = to_index, - replace_from, IF(from_logical, to_index, column_sequence), - replace_to, IF(to_logical, from_index, replace_from), + from_logical, column_sequence = from_value, + to_logical, column_sequence = to_value, + replace_from, IF(from_logical, to_value, column_sequence), + replace_to, IF(to_logical, from_value, replace_from), CHOOSECOLS(array, replace_to) ) ); @@ -15,13 +18,16 @@ SWAP_COLUMNS = LAMBDA(array, [from_index], [to_index], // NONE --> SWAP_ROWS SWAP_ROWS = LAMBDA(array, [from_index], [to_index], LET( + nrows, ROWS(array), from_index, IF(ISOMITTED(from_index), 1, from_index), - to_index, IF(ISOMITTED(to_index), 2, to_index), + to_index, IF(ISOMITTED(to_index), -1, to_index), + from_value, IF(from_index < 0, from_index + nrows + 1, from_index), + to_value, IF(to_index < 0, to_index + nrows + 1, to_index), row_sequence, SEQUENCE(ROWS(array)), - from_logical, row_sequence = from_index, - to_logical, row_sequence = to_index, - replace_from, IF(from_logical, to_index, row_sequence), - replace_to, IF(to_logical, from_index, replace_from), + from_logical, row_sequence = from_value, + to_logical, row_sequence = to_value, + replace_from, IF(from_logical, to_value, row_sequence), + replace_to, IF(to_logical, from_value, replace_from), CHOOSEROWS(array, replace_to) ) -); \ No newline at end of file +); diff --git a/_feidlambda/feid_TEXT b/_feidlambda/feid_TEXT index e907965..e84e033 100644 --- a/_feidlambda/feid_TEXT +++ b/_feidlambda/feid_TEXT @@ -1,16 +1,68 @@ -// NONE --> TEXT_SPLIT_VECTOR +// _RECURSIVE_TEXT_SPLIT --> _RECURSIVE_TEXT_SPLIT +_RECURSIVE_TEXT_SPLIT = LAMBDA( + text_vector, + ntry, + col_delimiter, + [row_delimiter], + [ignore_empty], + [match_mode], + [pad_with], + LET( + text_vector, TOCOL(text_vector), + selected_row, ARRAYTOTEXT(INDEX(text_vector, ntry)), + IF( + ntry = 1, + TEXTSPLIT(selected_row, col_delimiter, row_delimiter, ignore_empty, match_mode, pad_with), + LET( + next_try, ntry - 1, + results, TEXTSPLIT( + selected_row, + col_delimiter, + row_delimiter, + ignore_empty, + match_mode, + pad_with + ), + VSTACK( + _RECURSIVE_TEXT_SPLIT( + text_vector, + next_try, + col_delimiter, + row_delimiter, + ignore_empty, + match_mode, + pad_with + ), + results + ) + ) + ) + ) +); + +// _RECURSIVE_TEXT_SPLIT --> TEXT_SPLIT_VECTOR TEXT_SPLIT_VECTOR = LAMBDA( text_vector, - [text_delimiter], + [col_delimiter], [row_delimiter], [ignore_empty], [match_mode], [pad_with], + [replace_na], LET( - text_delimiter, IF(ISOMITTED(text_delimiter), " ", text_delimiter), - row_delimiter, IF(ISOMITTED(row_delimiter), "|<#>|", row_delimiter), + nrows, ROWS(text_vector), + col_delimiter, IF(ISOMITTED(col_delimiter), " ", col_delimiter), + replace_na, IF(ISOMITTED(replace_na), NA(), replace_na), pad_with, IF(ISOMITTED(pad_with), "", pad_with), - reduce_text, REDUCE(, text_vector, LAMBDA(acc, curr, CONCAT(acc, row_delimiter, curr))), - TEXTSPLIT(reduce_text, text_delimiter, row_delimiter, ignore_empty, match_mode, pad_with) + result, _RECURSIVE_TEXT_SPLIT( + text_vector, + nrows, + col_delimiter, + row_delimiter, + ignore_empty, + match_mode, + pad_with + ), + IFERROR(result, replace_na) ) -); \ No newline at end of file +); diff --git a/_quarto.yml b/_quarto.yml index f213e96..2f91186 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -22,8 +22,8 @@ website: # FOR TWITTER / open-graph - image: "fiakologo.png" - favicon: "fiakologo.png" + image: /assets/original_feidlambda_logo.png + favicon: /assets/original_feidlambda_logo.png ## NAVIGATION BAR navbar: @@ -34,35 +34,24 @@ website: collapse: true - logo: "fiakologo.png" + logo: /assets/original_feidlambda_logo.png left: - text: Home href: index.qmd - - text: Dokumentasi - menu: - - href: docs/penggunaan.qmd - - href: docs/glossary.qmd - - text: feidlambda 0.x + - text: feidlambda menu: - - href: release/feidlambda.qmd - - href: release/migration-v0-2-to-v0-3.qmd - - href: release/feidlambda-0-3-0.qmd + - href: release/source-code.qmd + - href: release/feidlambda-0-3.qmd - href: release/feidlambda-0-2-0.qmd - href: release/feidlambda-0-1-0.qmd - - text: Greenhorn + - text: Dokumentasi menu: - - text: "Greenhorn" - href: greenhorn/index.qmd - - text: feidlambda I - href: greenhorn/index.qmd - # href: greenhorn/feidlambda-2/presentation.qmd - - text: feidlambda II - href: greenhorn/feidlambda-2/index.qmd - - text: feidlambda III - href: greenhorn/index.qmd - # href: release/feidlambda-0-1-0.qmd - + - href: docs/install.qmd + - href: docs/glossary.qmd + - text: Artikel + menu: + - href: article/migration-v0-2-to-v0-3.qmd right: - icon: github @@ -74,7 +63,7 @@ website: contents: - section: "Dokumentasi" contents: - - href: docs/penggunaan.qmd + - href: docs/install.qmd - href: docs/glossary.qmd - id: side-feidlambda @@ -117,11 +106,9 @@ website: ## SIDEBAR page-footer: right: >- - developed by **fiako**dev. - built with ❤️ and [Quarto](https://quarto.org/). + developed by **fiako**dev left: >- - © 2022 PT. FIAKO ENJINIRING INDONESIA. - CC-BY-NC-SA 4.0. + © 2022-2023 PT. FIAKO ENJINIRING INDONESIA format: html: diff --git a/release/migration-v0-2-to-v0-3.qmd b/article/migration-v0-2-to-v0-3.qmd similarity index 99% rename from release/migration-v0-2-to-v0-3.qmd rename to article/migration-v0-2-to-v0-3.qmd index 8b74867..291a152 100644 --- a/release/migration-v0-2-to-v0-3.qmd +++ b/article/migration-v0-2-to-v0-3.qmd @@ -14,6 +14,9 @@ number-sections: false number-offset: [0, 0] link-external-newwindow: true +aliases: + - /release/migration-v0-2-to-v0-3.html + --- Halaman ini menjelaskan mengenai perubahan feidlambda v0.2 ke v0.3 dan panduan migrasinya. diff --git a/assets/original_feidlambda.png b/assets/original_feidlambda.png new file mode 100644 index 0000000..8021dfc Binary files /dev/null and b/assets/original_feidlambda.png differ diff --git a/assets/original_feidlambda_logo.png b/assets/original_feidlambda_logo.png new file mode 100644 index 0000000..37b333a Binary files /dev/null and b/assets/original_feidlambda_logo.png differ diff --git a/docs/penggunaan.qmd b/docs/install.qmd similarity index 78% rename from docs/penggunaan.qmd rename to docs/install.qmd index 0bfa268..cec9929 100644 --- a/docs/penggunaan.qmd +++ b/docs/install.qmd @@ -15,9 +15,13 @@ number-sections: true link-external-newwindow: true layout: article sidebar: side-docs + +aliases: + - penggunaan.html + --- -Panduan ini untuk __Advanced Formula Environment__ v1.1. Panduan versi sebelumnya (v1.0) bisa dilihat [disini](penggunaan-v1.qmd). +Panduan ini untuk __Advanced Formula Environment__ v1.1. ## **Advanced Formula Environment** @@ -38,7 +42,11 @@ Setelah AFE terpasang di Microsoft Excel, lakukan _import_ dengan membuka AFE me ## Salin _Github Gist URL_ -Isi "Github Gist URL" dengan link koleksi lambda yang tersedia ([Link Github Gist feidlambda v0.3](https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12)). _Checklist_ ✅ bagian "_Add formulas to new module_" dan isi nama _module_ dengan nama koleksi (contoh: `feid`). +Isi "Github Gist URL" dengan link koleksi lambda yang tersedia. _Checklist_ ✅ bagian "_Add formulas to new module_" dan isi nama _module_ dengan nama koleksi (contoh: `feid`). Berikut link feidlambda v0.3.x: + +```default +https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12 +``` ![Isi _GitHub Gist URL_ dan nama _module_](https://user-images.githubusercontent.com/1007910/210946750-5b2563aa-3e23-4147-8771-d7ab7a40a5e4.png) @@ -58,6 +66,6 @@ Selesai _save_, fungsi **feidlambda** bisa langsung digunakan. ## Baca dokumentasi **feidlambda** v0.3 -Dokumentasi feidlambda v0.3 bisa baca di halaman [feidlambda v0.3](/release/feidlambda-0-3-0.qmd). Dan panduan migrasi bisa baca di halaman [Migrasi feidlambda v0.2 ke v0.3](/release/migration-v0-2-to-v0-3.qmd). +Dokumentasi feidlambda v0.3 bisa baca di halaman [feidlambda v0.3](/release/feidlambda-0-3.qmd). Dan panduan migrasi bisa baca di halaman [Migrasi feidlambda v0.2 ke v0.3](/article/migration-v0-2-to-v0-3.qmd). Jangan lupa juga untuk membaca [Daftar istilah](/docs/glossary.qmd) yang digunakan dalam pada dokumentasi dan pengembangan feidlambda. \ No newline at end of file diff --git a/fiakologo.png b/fiakologo.png deleted file mode 100644 index 8b716f3..0000000 Binary files a/fiakologo.png and /dev/null differ diff --git a/index.qmd b/index.qmd index 4192143..2e8d1f4 100644 --- a/index.qmd +++ b/index.qmd @@ -9,21 +9,44 @@ page-layout: full sidebar: false --- -::: {.text-center .m-0} -# $\text{fe}\hat{i}\text{d} \textbf{l} \lambda \text{m} \textsf{b} \texttt{d} \bigtriangleup$ +::: {.text-center} +![](/assets/original_feidlambda.png){width="300"} ::: -::: {.text-center .callout-important appearance="simple" icon="false"} -## Dalam Pengembangan +::: {.text-center .mb-4} + +![](https://img.shields.io/github/v/release/fiakoenjiniring/feidlambda?color=informational&label=feidlambda&labelColor=blueviolet&logo=Microsoft%20Excel&style=flat-square){height=25} +![](https://img.shields.io/github/release-date/fiakoenjiniring/feidlambda?color=black&label=release%20date&labelColor=brown&logo=GitHub&logoColor=white){height=25} +![](https://img.shields.io/github/actions/workflow/status/fiakoenjiniring/feidlambda/publish.yml?branch=main&label=quarto&labelColor=informational&logo=GitHub%20Actions&logoColor=white){height=25} +![](https://img.shields.io/github/license/fiakoenjiniring/feidlambda?color=yellow&labelColor=brown&label=license&){height=25} -Saat ini `feidlambda` (koleksi LAMBDA) masih dalam tahap pengembangan. Untuk lebih jelasnya bisa membaca [Public Roadmap fiakodev Q4 2022](https://dev.fiako.engineering/logs/public-roadmap-october-2022). ::: -::: {.callout-tip icon="false" .text-center} -## Official GIST **feidlambda** +::: {.text-center} + +[](/docs/install.qmd) +[](/release/feidlambda-0-3.qmd) +[](/release/source-code.qmd) +[](https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12) + +### OFFICAL GIST URL (feidlambda v0.3.x) + +```default +https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12 +``` + +::: -#### [GIST feidlambda v0.3](https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12) +::: {.text-center .callout-tip appearance="minimal"} +## **STATUS PENGEMBANGAN** --- -[v0.3](release/feidlambda-0-3-0.qmd) | [v0.2](release/feidlambda-0-2-0.qmd) | [v0.1](release/feidlambda-0-1-0.qmd) | [panduan](docs/penggunaan.qmd) | [source code](release/feidlambda.qmd) -::: \ No newline at end of file + +**feidlambda v0.3** sudah siap digunakan oleh publik. Dengan catatan masih banyak yang perlu dipelajari, perbaiki, dan dikembangkan sehingga status feidlambda masih bersifat **eksperimental**. + +::: + +::: {.text-center .callout-warning appearance="minimal"} +Halaman *greenhorn* untuk sementara tidak tersedia di _navigation bar_. Untuk mengakses presentasi bisa mengunjungi [link ini](/greenhorn/feidlambda-2/presentation.qmd){target="_blank"}. +::: + diff --git a/release/excel/RELEASE_feidlambda_v0_3_1.xlsx b/release/excel/RELEASE_feidlambda_v0_3_1.xlsx new file mode 100644 index 0000000..b596841 Binary files /dev/null and b/release/excel/RELEASE_feidlambda_v0_3_1.xlsx differ diff --git a/release/feidlambda-0-1-0.qmd b/release/feidlambda-0-1-0.qmd index 3c0b09e..bf7528e 100644 --- a/release/feidlambda-0-1-0.qmd +++ b/release/feidlambda-0-1-0.qmd @@ -1,6 +1,6 @@ --- title: | - feidlambda 0.1.0 + feidlambda v0.1 subtitle: | Fitur terbaru di `feidlambda v0.1.0` author: "Taruma Sakti Megariansyah" diff --git a/release/feidlambda-0-2-0.qmd b/release/feidlambda-0-2-0.qmd index fc4782f..a14935e 100644 --- a/release/feidlambda-0-2-0.qmd +++ b/release/feidlambda-0-2-0.qmd @@ -1,6 +1,6 @@ --- title: | - feidlambda 0.2.0 + feidlambda v0.2 subtitle: | Fitur terbaru di `feidlambda v0.2.0` author: "Taruma Sakti Megariansyah" diff --git a/release/feidlambda-0-3-0.qmd b/release/feidlambda-0-3.qmd similarity index 71% rename from release/feidlambda-0-3-0.qmd rename to release/feidlambda-0-3.qmd index f4f255a..17412d4 100644 --- a/release/feidlambda-0-3-0.qmd +++ b/release/feidlambda-0-3.qmd @@ -1,11 +1,11 @@ --- title: | - feidlambda v0.3 + feidlambda v0.3.1 subtitle: | - Koleksi LAMBDA feidlambda v0.3 + Koleksi LAMBDA feidlambda v0.3.1 author: "Taruma Sakti Megariansyah" -date: 2022-12-28 -date-modified: 2023-01-06 +date: 2023-01-06 +date-modified: 2023-01-13 date-format: full lang: id @@ -26,15 +26,25 @@ format: crossref: chapters: true + +aliases: + - feidlambda-0-3-0.html + - feidlambda-0-3-1.html + --- -::: {.callout-important icon="false" .text-center} -## Official GIST **feidlambda** (v0.3) +::: {.callout-important icon="false" .text-center appearance="minimal"} +## Official GIST **feidlambda** (v0.3.x) + +```default +https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12 +``` -[Official GIST feidlambda (feid)](https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12) ::: -Bagi yang sebelumnya menggunakan versi feidlambda v0.2 **wajib** untuk membaca [perubahan penting dan migrasi v0.2 ke v0.3](migration-v0-2-to-v0-3.qmd). Tapi, bagi yang baru menggunakan bisa [**langsung ke bagian fungsi feidlambda v0.3**](#sec-feid-v03). +**Panduan instalasi feidlambda v0.3.x dapat dilihat di halaman [Penggunaan](/docs/install.qmd).** + +Bagi yang sebelumnya menggunakan versi feidlambda v0.2 **wajib** untuk membaca [perubahan penting dan migrasi v0.2 ke v0.3](/article/migration-v0-2-to-v0-3.qmd). Tapi, bagi yang baru menggunakan bisa [**langsung ke bagian fungsi feidlambda v0.3.x**](#sec-feid-v03). ::: {.column-screen-inset-shaded} @@ -42,9 +52,31 @@ Bagi yang sebelumnya menggunakan versi feidlambda v0.2 **wajib** untuk membaca [ ::: -# Fungsi feidlambda v0.3 {#sec-feid-v03} +# Update Log v0.3.x {#update-log} + +_Update Log_ merupakan catatan pembaruan feidlambda. Berikut catatan perubahan/pembaruan secara umum beserta penjelasan perubahan/pembaruan. Untuk perubahan berdasarkan fungsinya, bisa dilihat di bagian [_Changelog_](#changelog). -Pada feidlambda v0.3, setiap fungsi dikategorikan sesuai kegunaannya. Berikut kategori yang tersedia di feidlambda v0.3: +- **Update v0.3.1 (2022-01-13)** + - Pada fungsi `FILTER_MINMAX_ARRAY()` terdapat argumen opsional baru yaitu `take_first_only`. Jika `take_first_only = TRUE`, maka hasil filter minimum/maksimum hanya mengambil baris pertamanya saja (jika terdapat minimum/maksimum lebih dari satu baris). + - Pada fungsi `SWAP_*()`, nilai argumen `from_index` dan `to_index` menerima index negatif (indeks dari belakang). Bersamaan perubahan tersebut, nilai _default_ `to_index` menjadi `-1` yang artinya secara _default_ (tanpa argumen) fungsi `SWAP_*()` menukar posisi terdepan dengan terbelakang (baik berdasarkan baris ataupun kolom). + - Perubahan nama argumen pada beberapa fungsi seperti: + - `FILTER_MINMAX_COLUMN()`: `col -> column_index`, `with_lables -> with_label`. + - `GET_INDEX_2D()`: `return_order_only -> return_as_order`. + - `ROTATE_*()`: `n -> num_rotation`. + - `TEXT_SPLIT_VECTOR()`: `text_delimiter -> col_delimiter`. + - Fungsi `TEXT_SPLIT_VECTOR()` menggunakan metode _recursive_ dari fungsi `TEXTSPLIT()`. + - Pada fungsi `TEXT_SPLIT_VECTOR()` terdapat argumen opsional baru yaitu `replace_na`, yang berfungsi untuk mengubah nilai `#NA` dari hasil akhir. + - Tambahan informasi limitasi pada fungsi `TEXT_SPLIT_VECTOR()`. + +::: {.column-screen-inset-shaded} + +--- + +::: + +# Fungsi feidlambda v0.3.x {#sec-feid-v03} + +Pada feidlambda v0.3.x, setiap fungsi dikategorikan sesuai kegunaannya. Berikut kategori yang tersedia di feidlambda v0.3.x: - `FILTER_*`: Melakukan _filtering_ atau _subsetting_ (memilah) dari data. - `GET_*`: Mengambil informasi dari data. @@ -56,7 +88,11 @@ Pada feidlambda v0.3, setiap fungsi dikategorikan sesuai kegunaannya. Berikut ka - `SWAP_*`: Menukar posisi data. - `TEXT_*`: Fungsi tambahan yang berkaitan dengan teks. -Download excel demonstrasi [RELEASE_feidlambda_v0_3.xlsx](https://github.com/fiakoenjiniring/feidlambda/releases/download/v0.3.0/RELEASE_feidlambda_v0_3.xlsx), untuk memudahkan mengeksplorasi fungsi baru di feidlambda v0.3. +Download excel demonstrasi [RELEASE_feidlambda_v0_3_1.xlsx](https://github.com/fiakoenjiniring/feidlambda/releases/download/v0.3.1/RELEASE_feidlambda_v0_3_1.xlsx), untuk memudahkan mengeksplorasi fungsi baru di feidlambda v0.3.x. + +::: {.callout-note} +Gambar yang ditampilkan pada halaman ini merupakan dari versi sebelumnya (feidlambda v0.3.0) dan tidak diperbarui untuk setiap _update_. Oleh karena itu, disarankan untuk mengeksplorasi langsung dari dokumen yang telah dilampirkan. +::: ::: {.column-screen-inset-shaded} @@ -66,7 +102,7 @@ Download excel demonstrasi [RELEASE_feidlambda_v0_3.xlsx](https://github.com/fia # Kategori `FILTER_*` {#sec-filter} -Kategori `FILTER_*` merupakan kumpulan fungsi yang melakukan _filtering_ atau _subsetting_ (memilah) dari data berupa vektor ataupun array. Hubungan antar fungsi di kategori ini bisa dilihat di @fig-dep-filter. +Kategori `FILTER_*` merupakan kumpulan fungsi yang melakukan _filtering_ atau _subsetting_ (memilah) data berupa _vector_ ataupun _array_. Hubungan antar fungsi di kategori ini bisa dilihat di @fig-dep-filter. ```{mermaid} %%| label: fig-dep-filter @@ -152,14 +188,14 @@ _Output_ ### `FILTER_MINMAX_ARRAY()` {#sec-filter-minmax-array} -Fungsi `FILTER_MINMAX_ARRAY(array, [ignore_first_column], [with_labels], [label_vector])` digunakan untuk melakukan _filtering_ (memilah) data berdasarkan nilai minimum dan maksimum setiap kolomnya dan mengeluarkan hasil dalam berupa _dynamic array_. +Fungsi `FILTER_MINMAX_ARRAY(array, [ignore_first_column], [with_label], [label_vector], [take_first_only])` digunakan untuk melakukan _filtering_ (memilah) data berdasarkan nilai minimum dan maksimum setiap kolomnya dan mengeluarkan hasil dalam berupa _dynamic array_. ::::: {.border .p-3 .my-3 .justify} ::: {.text-center .syntax} _Syntax_ -: FILTER_MINMAX_ARRAY(array, [ignore_first_column], [with_labels], [label_vector]) +: FILTER_MINMAX_ARRAY(array, [ignore_first_column], [with_label], [label_vector], [take_first_only]) _Output_ : _array_ @@ -174,12 +210,15 @@ _Output_ `[ignore_first_column] := FALSE :: [TRUE | FALSE]` : Nilai _default_ yaitu `FALSE`. Jika `TRUE`, maka kolom pertama dari `array` akan diabaikan dan tidak dilakukan _filtering_ nilai minimum/maksimum. -`[with_labels] := FALSE :: [TRUE | FALSE]` +`[with_label] := FALSE :: [TRUE | FALSE]` : Nilai _default_ yaitu `FALSE`. Jika `TRUE`, maka kolom pertama dari _output_ adalah label informasi minimum dan maksimum seperti `1_min`, `1_max`, atau `no.column_min` dan `no.column_max`. Untuk menggunakan label sendiri, masukin _vector_ label di argumen `label_vector`. `[label_vector] := NONE :: [vector]` : Nilai _default_ yaitu `NONE`. Jika `NONE`, maka label setiap baris akan dinomori berdasarkan kolomnya (`1_min`, `1_max`). Jika ingin menggunakan label dari nama kolom, jumlah elemen _vector_ harus sama dengan jumlah kolom dari `array`. Untuk menggunakan label nilai `with_label` harus `TRUE`. +`[take_first_only] := FALSE :: [TRUE | FALSE]` +: **_(New in v0.3.1)_**. Nilai _default_ yaitu `FALSE`. Jika `TRUE`, maka hanya baris pertama yang diambil dari hasil pencarian nilai minimum/maksimum. + ::::: ::: {#fig-filter-minmax-array .column-screen-inset layout="[[1,1]]" layout-valign="bottom"} @@ -220,17 +259,17 @@ Dari @fig-dep-get, diketahui untuk versi v0.3 hanya tersedia fungsi `GET_INDEX_2 ### `GET_INDEX_2D()` -Fungsi `GET_INDEX_2D(lookup_value, array, [return_order_only])` dapat digunakan untuk mengambil informasi urutan nilai yang dicari ataupun posisi baris/kolom dari `array`. +Fungsi `GET_INDEX_2D(lookup_value, array, [return_as_order])` dapat digunakan untuk mengambil informasi urutan nilai yang dicari ataupun posisi baris/kolom dari `array`. ::::: {.border .p-3 .my-3 .justify} ::: {.text-center .syntax} _Syntax_ -: GET_INDEX_2D(lookup_value, array, [return_order_only]) +: GET_INDEX_2D(lookup_value, array, [return_as_order]) _Output_ -: _array_ ([_order_, _row index_, _column index_]) atau _number_ (_order_) +: _array_ ([_order_, _row index_, _column index_]) atau _number vector_ (_order_) ::: @@ -242,7 +281,7 @@ _Output_ `array := [array]` : Data berupa _array_. -`[return_order_only] := FALSE :: [TRUE | FALSE]` +`[return_as_order] := FALSE :: [TRUE | FALSE]` : Nilai _default_ yaitu `FALSE`. Jika `TRUE`, hasil fungsi memberikan urutan angka nilai yang dicari. Urutan dimulai dari horizontal kiri teratas sampai kanan terbawah. Jika `FALSE`, maka _output_ terdiri dari nomor urut, indeks kolom, dan indeks baris. ::::: @@ -632,7 +671,7 @@ Fungsi utama yang tersedia saat ini hanya `RESHAPE_BY_COLUMNS()`. ### `RESHAPE_BY_COLUMNS()` -Fungsi `RESHAPE_BY_COLUMNS(array, [num_split])` digunakan untuk mengubah dimensi (transformasi) `array` berdasarkan jumlah pembagi kolomnya. +Fungsi `RESHAPE_BY_COLUMNS(array, [num_split])` digunakan untuk mengubah dimensi (transformasi) `array` berdasarkan jumlah pembagi kolomnya. Jika tidak jumlah kolom tidak habis dibagi oleh `num_split` akan mengeluarkan hasil `#N/A`. ::::: {.border .p-3 .my-3 .justify} @@ -689,13 +728,13 @@ Seluruh fungsi yang tersedia di kategori ini akan dijelaskan. ### `ROTATE_VECTOR()` -Fungsi `ROTATE_VECTOR(vector, n, [as_column_vector])` digunakan untuk menggeser/memutar elemen yang ada di _vector_ sebanyak `n`. +Fungsi `ROTATE_VECTOR(vector, num_rotation, [as_column_vector])` digunakan untuk menggeser/memutar elemen yang ada di _vector_ sebanyak `num_rotation`. ::::: {.border .p-3 .my-3 .justify} ::: {.text-center .syntax} _Syntax_ -: ROTATE_VECTOR(vector, n, [as_column_vector]) +: ROTATE_VECTOR(vector, num_rotation, [as_column_vector]) _Output_ : _vector_ @@ -706,7 +745,7 @@ _Output_ `vector := [vector]` : Data berupa _vector_ (_column vector_ atau _row vector_). -`n := [integer]` +`num_rotation := [integer]` : Jumlah berapa kali _vector_ diputar/digeser. Nilai negatif untuk digeser berlawanan arah. `[as_column_vector] := TRUE :: [TRUE | FALSE]` @@ -720,13 +759,13 @@ _Output_ ### `ROTATE_ARRAY()` -Fungsi `ROTATE_ARRAY(array, n, [rotate_columns])` digunakan untuk menggeser/memutar elemen yang ada di _array_ sebanyak `n` berdasarkan baris atau kolom. +Fungsi `ROTATE_ARRAY(array, num_rotation, [rotate_columns])` digunakan untuk menggeser/memutar elemen yang ada di _array_ sebanyak `num_rotation` berdasarkan baris atau kolom. ::::: {.border .p-3 .my-3 .justify} ::: {.text-center .syntax} _Syntax_ -: ROTATE_ARRAY(array, n, [rotate_columns]) +: ROTATE_ARRAY(array, num_rotation, [rotate_columns]) _Output_ : _array_ @@ -737,7 +776,7 @@ _Output_ `array := [array]` : Data berupa _array_. -`n := [scalar | vector]` +`num_rotation := [scalar | vector]` : Jumlah berapa kali _vector_ diputar/digeser. Nilai negatif untuk digeser berlawanan arah. `[rotate_columns] := TRUE :: [TRUE | FALSE]` @@ -798,10 +837,10 @@ _Output_ : Data dapat berupa _array_ atau _row vector_. `[from_index] := 1 :: [integer]` -: Nilai _default_ yaitu 1. Posisi _index_ kolom yang ingin dipindahkan. +: **_(Change in v0.3.1)_**. Nilai _default_ yaitu `1`. Posisi _index_ kolom yang ingin dipindahkan. Jika menggunakan indeks negatif, maka posisi diambil dari belakang. -`[to_index] := 2 :: [integer]` -: Nilai _default_ yaitu 2. Posisi _index_ tujuan kolom. +`[to_index] := -1 :: [integer]` +: **_(Change in v0.3.1)_**. Nilai _default_ yaitu `-1`. Posisi _index_ tujuan kolom. Jika menggunakan indeks negatif, maka posisi diambil dari belakang. ::::: @@ -825,10 +864,10 @@ _Output_ : Data dapat berupa _array_ atau _column vector_. `[from_index] := 1 :: [integer]` -: Nilai _default_ yaitu 1. Posisi _index_ baris yang ingin dipindahkan. +: **_(Change in v0.3.1)_**. Nilai _default_ yaitu `1`. Posisi _index_ baris yang ingin dipindahkan. Jika menggunakan indeks negatif, maka posisi diambil dari belakang. -`[to_index] := 2 :: [integer]` -: Nilai _default_ yaitu 2. Posisi _index_ tujuan baris. +`[to_index] := -1 :: [integer]` +: **_(Change in v0.3.1)_**. Nilai _default_ yaitu `-1`. Posisi _index_ tujuan baris. Jika menggunakan indeks negatif, maka posisi diambil dari belakang. ::::: @@ -853,7 +892,8 @@ Kategori `TEXT_*` merupakan kumpulan fungsi yang digunakan untuk memproses data %%{ init: { 'theme': 'forest' } }%% flowchart LR - NONE --> TEXT_SPLIT_VECTOR + _RECURSIVE_TEXT_SPLIT --> _RECURSIVE_TEXT_SPLIT + _RECURSIVE_TEXT_SPLIT --> TEXT_SPLIT_VECTOR ``` Seluruh fungsi yang tersedia di kategori ini akan dijelaskan. @@ -866,13 +906,13 @@ Seluruh fungsi yang tersedia di kategori ini akan dijelaskan. ### `TEXT_SPLIT_VECTOR()` -Fungsi `TEXT_SPLIT_VECTOR(text_vector, [text_delimiter], [row_delimiter], [ignore_empty], [match_mode], [pad_with])` merupakan fungsi pengembangan lanjutan dari `TEXTSPLIT()` yang mampu menerima _input_ data berupa _vector_ dan menghasilkan dalam bentuk _dynamic array_. +Fungsi `TEXT_SPLIT_VECTOR(text_vector, [col_delimiter], [row_delimiter], [ignore_empty], [match_mode], [pad_with], [replace_na])` merupakan fungsi pengembangan lanjutan dari `TEXTSPLIT()` yang mampu menerima _input_ data berupa _vector_ dan menghasilkan dalam bentuk _dynamic array_. ::::: {.border .p-3 .my-3 .justify} ::: {.text-center .syntax} _Syntax_ -: TEXT_SPLIT_VECTOR(text_vector, [text_delimiter], [row_delimiter], [ignore_empty], [match_mode], [pad_with]) +: TEXT_SPLIT_VECTOR(text_vector, [col_delimiter], [row_delimiter], [ignore_empty], [match_mode], [pad_with], [replace_na]) _Output_ : _array_ @@ -883,11 +923,11 @@ _Output_ `text_vector := [text vector]` : Data harus berupa _text column vector_. -`[text_delimiter] := " " :: [text]` +`[col_delimiter] := " " :: [text]` : Nilai _default_ yaitu `" "` (spasi). Teks pemisah untuk setiap kolomnya. -`[row_delimiter] := "|<#>|" :: [text]` -: Nilai _default_ yaitu `"|<#>|"` (spasi). Teks pemisah untuk setiap barisnya. Fungsi `TEXT_SPLIT_VECTOR()` akan membuat `text_vector` menjadi tipe teks _scalar_ sebelum diubah menjadi _dynamic array_. Sehingga, opsi ini sebaiknya disesuaikan dengan teks yang ada di `text_vector`. +`[row_delimiter] := "" :: [text]` +: **_(Change in v0.3.1)_**. Nilai _default_ yaitu `""` (tidak ada). Teks pemisah untuk setiap barisnya. `[ignore_empty] := FALSE :: [TRUE | FALSE]` : Tentukan `TRUE` untuk mengabaikan pemisah berurutan. Default ke `FALSE`, yang membuat sel kosong. Opsional. @@ -896,14 +936,23 @@ _Output_ : Tentukan `1` untuk melakukan kecocokan yang tidak peka huruf besar kecil. Default ke `0`, yang melakukan kecocokan peka huruf besar kecil. Opsional. `[pad_with] := #N/A :: [text | number]` -: Nilai untuk mengalihkan hasil. Defaultnya adalah #N/A. +: Nilai untuk mengalihkan hasil. Defaultnya adalah `#N/A`. + +`[replace_na] := #N/A :: [text | number]` +: **_(New in v0.3.1)_**. Nilai untuk menggantikan nilai `#N/A` dari hasil akhir. Defaultnya adalah `#N/A`. Nilai `#N/A` yang ada dikarenakan proses `VSTACK()` yang memiliki dimensi hasil `TEXTSPLIT()` yang berbeda-beda. ::::: Deskripsi `ignore_empty`, `match_mode`, dan `pad_with` diambil dari halaman [Fungsi TEXTSPLIT](https://support.microsoft.com/id-id/office/fungsi-textsplit-b1ca414e-4c21-4ca0-b1b7-bdecace8a6e7). +#### Limitasi `TEXT_SPLIT_VECTOR()` + +- Hindari menggunakan `TEXT_SPLIT_VECTOR()` dengan jumlah baris yang banyak ataupun dimensi _output_ yang besar. Pastikan hasil _output_ fungsi memiliki dimensi yang kecil seperti jumlah kolom $\le 10$ dan jumlah baris $\le 1,000$. +- Ukuran `text_vector` masih bisa lebih besar dari batasan diatas, akan tetapi disarankan untuk penggunaan `TEXT_SPLIT_VECTOR()` selalu bertahap, yaitu dari jumlah baris yang sedikit sampai jumlah baris optimal yang tidak menampilkan _error_ atau _crash_. +- Jika melebihi kemampuan, akan menghasilkan nilai _error_ berupa `#NUM` / `#CALC`. + ::: {.column-page} -![Demonstrasi `TEXT_SPLIT_VECTOR`](img-0-3-0/feidlambda-v03-09-text-1.gif){#fig-text-split-vector} +![Demonstrasi `TEXT_SPLIT_VECTOR` (outdated)](img-0-3-0/feidlambda-v03-09-text-1.gif){#fig-text-split-vector} ::: ::: {.column-screen-inset-shaded} @@ -920,4 +969,44 @@ Jika ada ide untuk pengembangan feidlambda atau fungsi baru bisa langsung membua --- -::: \ No newline at end of file +::: + +# Changelog + +- **2022-01-13 (v0.3.1)** + - Perubahan fungsi utama: + - Perubahan `FILTER_MINMAX_ARRAY()`: + - Menambah _optional_ argumen `take_first_only`. + - Mengganti nama argumen: `with_labels -> with_label`. + - Penyesuaian `_RECURSIVE_FILTER_MINMAX()` dengan posisi dan opsi argumen terbaru. + - Perubahan `GET_INDEX_2D()`: + - Mengubah nama argumen: `return_order_only -> return_as_order`. + - Perubahan `RESHAPE_BY_COLUMNS()`: + - Mengubah hasil _error_ menjadi `NA()`. + - Perubahan `ROTATE_VECTOR()` dan `ROTATE_ARRAY()`: + - Mengubah nama argumen: `n -> num_rotation`. + - Perubahan `SWAP_COLUMNS()` dan `SWAP_ROWS()`: + - Argumen `from_index` dan `to_index` dapat menggunakan indeks negatif. + - Nilai _default_ `to_index` menjadi `-1`. + - Perubahan `TEXT_SPLIT_VECTOR()`: + - Mengubah metode menjadi _recursive_. + - Mengubah nama argumen: `text_delimiter -> col_delimiter`. + - Menambah _optional_ argumen `replace_na`. + - Perubahan fungsi pendukung: + - Perubahan `FILTER_FUNC_COLUMN()`: + - Mengganti nama argumen: `col -> column_index`. + - Menukar posisi argumen `label_col` dan `with_label`. + - Menambah optional argumen `take_first_only`. + - Perubahan `FILTER_MINMAX_COLUMN()`: + - Mengganti nama argumen: `col -> column_index`. + - Menukar posisi argumen `label_col` dan `with_label`. + - Menambah _optional_ argumen `take_first_only`. + - Penyesuaian `FILTER_FUNC_COLUMN()` dengan posisi dan opsi argumen terbaru. + - Perubahan `_RECURSIVE_FILTER_MINMAX()`: + - Mengubah posisi argumen `label_col` dan `with_label`. + - Penyesuaian `FILTER_MINMAX_COLUMN()` dengan posisi dan opsi argumen terbaru. + - Fungsi baru `_RECURSIVE_TEXT_SPLIT()`: + - Fungsi pendukung `TEXT_SPLIT_VECTOR()`. +- **2022-01-06 (v0.3.0)** + - Rilis feidlambda v0.3 + diff --git a/release/feidlambda.qmd b/release/feidlambda.qmd deleted file mode 100644 index fa8d1e8..0000000 --- a/release/feidlambda.qmd +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: | - _Source Code_ feidlambda -subtitle: | - _Source Code_ feidlambda v0.3 -author: fiakodev -date: 2022-09-28 -date-modified: 2023-01-06 -toc: false -link-external-newwindow: true -layout: article -license: MIT LICENSE -lang: id -date-format: full - -code-copy: true -code-line-numbers: true -code-link: true -code-block-border-left: "#34a3f7" -code-overflow: scroll - -filters: - - "../include-code-files.lua" - ---- - -::: {.callout-note icon="false" .text-center} -## Official GIST **feidlambda** (v0.3) -[Official GIST feidlambda v0.3](https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12) -::: - -```{.scala include="../_feidlambda/feid"} -``` \ No newline at end of file diff --git a/release/source-code.qmd b/release/source-code.qmd new file mode 100644 index 0000000..ed8bc76 --- /dev/null +++ b/release/source-code.qmd @@ -0,0 +1,24 @@ +--- +title: | + _Source Code_ +subtitle: | + _Source Code_ feidlambda v0.3 +# author: fiakodev +toc: false +link-external-newwindow: true +layout: article +license: MIT LICENSE +lang: id + +code-copy: true +code-line-numbers: true +# code-block-border-left: "#34a3f7" +# code-overflow: scroll + +filters: + - "../include-code-files.lua" + +--- + +```{.scala include="../_feidlambda/feid"} +``` \ No newline at end of file