Nothing
## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
eval = FALSE
)
## ----setup--------------------------------------------------------------------
# library(bidux)
# # Optional tibble support
# if (requireNamespace("tibble", quietly = TRUE)) {
# library(tibble)
# }
## ----data_story_recommended---------------------------------------------------
# # RECOMMENDED: Create a structured data story using the modern flat API
# story <- new_data_story(
# hook = "Users struggle with complex form layouts leading to abandonment",
# context = "User Interface Cognitive Load Analysis for complex form layouts with 40% improvement potential",
# tension = "Current forms overwhelm users with cognitive load and lack clear guidance",
# resolution = "Implement step-by-step form progression with visual progress indicators"
# )
#
# # Enhanced print method
# print(story)
#
# # Access story elements directly using the flat API
# story$hook
# story$context
# story$tension
# story$resolution
#
# # Story is automatically structured for further BID framework usage
## ----data_story_deprecated, eval = FALSE--------------------------------------
# # DEPRECATED: Nested format (will be removed in 0.4.0)
# # This will trigger a deprecation warning
# story_old <- new_data_story(
# context = "Dashboard usage analysis",
# variables = list(
# metric = "engagement",
# trend = "declining"
# ),
# relationships = list(
# correlation = "negative_with_complexity"
# )
# )
# # Warning: Using deprecated nested format for data_story
# # The flat API is now recommended: new_data_story(hook, context, tension, resolution)
# # Nested format (variables, relationships) will be removed in bidux 0.4.0
## ----migration_old, eval = FALSE----------------------------------------------
# # OLD (deprecated)
# story <- new_data_story(
# context = "Dashboard usage dropped",
# variables = list(hook = "User engagement declining"),
# relationships = list(resolution = "Analyze telemetry")
# )
## ----migration_new, eval = FALSE----------------------------------------------
# # NEW (recommended)
# story <- new_data_story(
# hook = "User engagement declining",
# context = "Dashboard usage dropped 30%",
# tension = "Don't know if UX or user needs",
# resolution = "Analyze telemetry"
# )
## ----interpret----------------------------------------------------------------
# # Basic interpretation with modern flat API (RECOMMENDED)
# result <- bid_interpret(
# central_question = "How can we reduce cognitive load in our signup form?",
# data_story = new_data_story(
# hook = "Users abandon signup forms at 60% rate",
# context = "Current form has 15 required fields",
# tension = "Users feel overwhelmed and leave",
# resolution = "Simplify form using progressive disclosure"
# ),
# quiet = FALSE
# )
#
# # View results
# print(result)
#
# # Enhanced interpretation with user personas
# interpretation <- bid_interpret(
# central_question = "What drives user engagement in our dashboard?",
# data_story = new_data_story(
# hook = "Daily active users declining despite new features",
# context = "Rich dashboard with multiple visualizations",
# tension = "Users aren't discovering valuable insights",
# resolution = "Guide attention to high-value content"
# ),
# user_personas = list(
# list(
# name = "Data Analyst",
# goals = "Find patterns quickly",
# pain_points = "Too many visualizations",
# technical_level = "Advanced"
# )
# ),
# quiet = TRUE
# )
#
# # Enhanced S3 print method shows summary
# print(interpretation)
## ----structure----------------------------------------------------------------
# # Follow correct BID framework order: Interpret → Notice → Anticipate → Structure
# notice_result <- result |>
# bid_notice(
# problem = "Users struggle with cognitive overload in signup forms",
# evidence = "60% abandonment rate and user feedback surveys",
# quiet = TRUE
# )
#
# # Anticipate potential user interactions and biases
# anticipate_result <- notice_result |>
# bid_anticipate(
# interaction_modes = list(
# primary = "Progressive form completion",
# fallback = "Quick signup option"
# ),
# quiet = TRUE
# )
#
# # Structure creates actionable dashboard recommendations
# structured <- bid_structure(
# previous_stage = anticipate_result,
# concepts = c("Progressive Disclosure", "Cognitive Load Theory"),
# quiet = TRUE
# )
#
# # View auto-selected layout and concept-grouped suggestions
# print(paste("Auto-selected layout:", structured$layout))
# print("Structured recommendations:")
# print(structured$suggestions)
#
# # Summary provides overview of all recommendations
# summary(structured)
## ----workflow-----------------------------------------------------------------
# # Step 1: Interpret user needs and context (using RECOMMENDED flat API)
# ui_analysis <- bid_interpret(
# central_question = "How can we improve landing page conversion without damaging user trust?",
# data_story = new_data_story(
# hook = "High-pressure sales tactics may be reducing user trust",
# context = "Landing page with multiple persuasive elements",
# tension = "Need conversions but not at expense of user experience",
# resolution = "Balance persuasion with trust-building elements"
# ),
# user_personas = list(
# list(
# name = "Potential Customer",
# goals = "Evaluate product value",
# pain_points = "Feels pressured by aggressive sales tactics",
# technical_level = "Basic"
# )
# ),
# quiet = TRUE
# )
#
# # Step 2: Notice specific problems
# problem_analysis <- ui_analysis |>
# bid_notice(
# problem = "Aggressive persuasion tactics creating user pressure",
# evidence = "Lower conversion rates and negative user feedback on pressure tactics",
# quiet = TRUE
# )
#
# # Step 3: Anticipate user interactions and cognitive biases
# interaction_analysis <- problem_analysis |>
# bid_anticipate(
# interaction_modes = list(
# primary = "Trust-based evaluation of product value",
# secondary = "Quick decision under time pressure"
# ),
# quiet = TRUE
# )
#
# # Step 4: Structure actionable recommendations
# recommendations <- bid_structure(
# previous_stage = interaction_analysis,
# concepts = c("Social Proof", "Trust Signals", "Progressive Disclosure"),
# quiet = TRUE
# )
#
# # Step 5: Validate design decisions
# validation_analysis <- bid_validate(
# previous_stage = recommendations,
# validation_method = "expert_review",
# quiet = TRUE
# )
#
# # Step 6: Create comprehensive data story from complete workflow using flat API
# optimization_story <- new_data_story(
# hook = "High-pressure persuasive elements creating user trust concerns",
# context = "Complete BID Framework Analysis: Landing Page Trust-Based Conversion Optimization across all 5 stages",
# tension = "Need to balance conversion goals with user trust - current approach damages long-term relationships",
# resolution = "Apply validated BID framework recommendations balancing persuasion with trust-building, monitoring both conversion rates and user trust metrics"
# )
#
# # View complete analysis results
# print("=== Complete BID Framework Workflow Results ===")
# print(optimization_story)
# print("\n=== Stage Summaries ===")
# summary(recommendations)
# summary(validation_analysis)
## ----validation, error = TRUE-------------------------------------------------
try({
# # Clear error messages for invalid inputs
# try(bid_interpret()) # Missing required parameter
# try(bid_interpret(central_question = 123)) # Wrong type for central_question
# try(bid_interpret(central_question = "test", data_story = "invalid")) # Invalid data_story
#
# # Descriptive validation errors for data story creation (flat API)
# try(new_data_story()) # Missing required parameter (context)
# try(new_data_story(context = "")) # Invalid empty context
#
# # Deprecated format still validates (but triggers warnings)
# try(new_data_story(
# context = "Valid context",
# variables = "invalid_type" # Must be a list
# ))
})
## ----deprecation_warning, eval = FALSE----------------------------------------
# # Using deprecated nested format triggers warning
# story <- new_data_story(
# context = "Dashboard analysis",
# variables = list(metric = "engagement"),
# relationships = list(trend = "declining")
# )
# # Warning message:
# # ! Using deprecated nested format for data_story
# # ℹ The flat API is now recommended: new_data_story(hook, context, tension, resolution)
# # ℹ Nested format (variables, relationships) will be removed in bidux 0.4.0
## ----telemetry_presets--------------------------------------------------------
# # Three sensitivity levels available:
# # - "strict": Detects even minor issues (for critical apps or new dashboards)
# # - "moderate": Balanced default (appropriate for most applications)
# # - "relaxed": Only detects major issues (for mature, stable dashboards)
#
# # Get strict sensitivity thresholds
# strict_thresholds <- bid_telemetry_presets("strict")
# print(strict_thresholds)
#
# # Get moderate sensitivity (default)
# moderate_thresholds <- bid_telemetry_presets("moderate")
#
# # Get relaxed sensitivity
# relaxed_thresholds <- bid_telemetry_presets("relaxed")
## ----telemetry_usage, eval = FALSE--------------------------------------------
# # Use strict preset for critical application
# issues <- bid_ingest_telemetry(
# "telemetry.sqlite",
# thresholds = bid_telemetry_presets("strict")
# )
#
# # Use relaxed preset for mature dashboard
# issues <- bid_ingest_telemetry(
# "telemetry.sqlite",
# thresholds = bid_telemetry_presets("relaxed")
# )
#
# # Override specific thresholds while using a preset as base
# custom_thresholds <- bid_telemetry_presets("moderate")
# custom_thresholds$unused_input_threshold <- 0.03 # More sensitive to unused inputs
# issues <- bid_ingest_telemetry("telemetry.sqlite", thresholds = custom_thresholds)
## ----tibble-------------------------------------------------------------------
# # Check if tibble is available
# if (requireNamespace("tibble", quietly = TRUE)) {
# # BID framework functions return tibbles by default when available
# # Using RECOMMENDED flat API
# result_tbl <- bid_interpret(
# central_question = "How can we test tibble integration?",
# data_story = new_data_story(
# hook = "Package supports modern tibble output",
# context = "Enhanced data handling with tibble package",
# tension = "Need to verify integration works correctly",
# resolution = "Test and validate tibble functionality"
# ),
# quiet = TRUE
# )
#
# cat("Result class:", class(result_tbl), "\n")
#
# # Works seamlessly with dplyr if available
# if (requireNamespace("dplyr", quietly = TRUE)) {
# library(dplyr)
#
# # Filter and analyze BID framework results
# interpret_summary <- result_tbl %>%
# select(stage, central_question, hook) %>%
# filter(!is.na(central_question))
#
# print(interpret_summary)
# }
# } else {
# cat("Tibble package not available, using base data.frame\n")
# }
## ----consistency--------------------------------------------------------------
# # Consistent parameter patterns across functions
# bid_interpret_params <- c("text", "method", "context", "return_tibble", "quiet")
# bid_structure_params <- c("insights", "format", "priority", "context", "return_tibble", "quiet")
#
# # Common parameters:
# # - return_tibble: Enable modern tibble output
# # - quiet: Control informational messages
# # - context: Provide analysis context
#
# # All functions return objects with:
# # - S3 classes for proper method dispatch
# # - Timestamp columns for tracking
# # - Consistent attribute structures
# # - Modern data types (tibble when available)
## ----backward_compatibility, eval = FALSE-------------------------------------
# # Legacy nested format still works (with deprecation warning)
# old_style_story <- new_data_story(
# context = "Dashboard analysis",
# variables = list(metric = "engagement"),
# relationships = list(trend = "declining")
# )
# # Triggers deprecation warning but functions correctly
#
# # Modern flat API is recommended
# new_style_story <- new_data_story(
# hook = "Engagement metrics show concerning trends",
# context = "Dashboard analysis of Q3 2024 usage patterns",
# tension = "User engagement declining despite new features",
# resolution = "Implement BID framework to identify UX friction"
# )
#
# # Both can be used with bid_interpret()
# result_old <- bid_interpret(
# central_question = "How to improve engagement?",
# data_story = old_style_story,
# quiet = TRUE
# )
#
# result_new <- bid_interpret(
# central_question = "How to improve engagement?",
# data_story = new_style_story,
# quiet = TRUE
# )
#
# # Both return compatible structures
# identical(names(result_old), names(result_new))
## ----migration_strategy, eval = FALSE-----------------------------------------
# # Step 1: Identify all new_data_story() calls with variables/relationships
# # Step 2: Extract nested values and flatten
#
# # OLD CODE
# story <- new_data_story(
# context = "User study results",
# variables = list(
# hook = "Users struggle with feature discovery",
# metric = "task_completion_rate",
# value = 0.42
# ),
# relationships = list(
# resolution = "Redesign navigation with progressive disclosure"
# )
# )
#
# # NEW CODE (flattened)
# story <- new_data_story(
# hook = "Users struggle with feature discovery",
# context = "User study results: 42% task completion rate",
# tension = "Low discoverability preventing user success",
# resolution = "Redesign navigation with progressive disclosure",
# # Optional metadata for extra fields
# metric = "task_completion_rate",
# value = 0.42
# )
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.