{"id":33907089,"url":"https://github.com/dalyanalytics/shinyfa","last_synced_at":"2026-03-09T08:02:07.860Z","repository":{"id":280747579,"uuid":"934367779","full_name":"dalyanalytics/shinyfa","owner":"dalyanalytics","description":"Easily analyze the file contents of Shiny apps 🗂️","archived":false,"fork":false,"pushed_at":"2025-11-10T18:29:49.000Z","size":6625,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-08T19:29:40.739Z","etag":null,"topics":["analysis","r-lang","rstats","shiny","shiny-r"],"latest_commit_sha":null,"homepage":"https://dalyanalytics.github.io/shinyfa/","language":"R","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dalyanalytics.png","metadata":{"files":{"readme":"README.md","changelog":"NEWS.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-02-17T17:58:17.000Z","updated_at":"2025-11-10T18:26:53.000Z","dependencies_parsed_at":"2025-03-05T05:24:26.021Z","dependency_job_id":"32185fc1-3d5c-4683-ba49-a78a5417f79d","html_url":"https://github.com/dalyanalytics/shinyfa","commit_stats":null,"previous_names":["dalyanalytics/shinyfa"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dalyanalytics/shinyfa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalyanalytics%2Fshinyfa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalyanalytics%2Fshinyfa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalyanalytics%2Fshinyfa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalyanalytics%2Fshinyfa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dalyanalytics","download_url":"https://codeload.github.com/dalyanalytics/shinyfa/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalyanalytics%2Fshinyfa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30287446,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-09T02:57:19.223Z","status":"ssl_error","status_checked_at":"2026-03-09T02:56:26.373Z","response_time":61,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analysis","r-lang","rstats","shiny","shiny-r"],"created_at":"2025-12-12T02:24:11.696Z","updated_at":"2026-03-09T08:02:07.843Z","avatar_url":"https://github.com/dalyanalytics.png","language":"R","funding_links":[],"categories":[],"sub_categories":[],"readme":"# shinyfa\n\n\u003cimg src=\"https://media.githubusercontent.com/media/dalyanalytics/shinyfa/refs/heads/main/man/figures/shinyfa-logo.png\" align=\"right\" alt=\"shinyfa logo\" width=\"200\" /\u003e\n\n\n\u003c!-- badges: start --\u003e\n[![Lifecycle: stable](https://img.shields.io/badge/lifecycle-stable-green.svg)](https://lifecycle.r-lib.org/articles/stages.html#stable)\n[![R-CMD-check](https://github.com/dalyanalytics/shinyfa/actions/workflows/pkgdown.yaml/badge.svg)](https://github.com/dalyanalytics/shinyfa/actions/workflows/pkgdown.yaml)\n\u003c!-- badges: end --\u003e\n\n\nThe `{shinyfa}` package is designed to help Shiny developers analyze and understand the file contents of large Shiny app directories.  \n\nLarge Shiny applications often contain numerous files that define both dynamic UI and server components, sometimes linked together in complex sourcing chains (though this is less common in Shiny apps structured with modules). For new contributors—such as consultants joining a project—it can take considerable time to onboard, navigate the codebase, and identify areas for optimization.  \n\nThis package aims to streamline that process by extracting key information from a Shiny app directory. It identifies specific render functions, reactive functions, and their inputs, organizing them into a structured `data.frame` for easy reference.  \n\nThe *fa* in *shinyfa* stands for *file analysis*.\n\n## 🎯 Why use shinyfa?\n\n- **📊 Audit reactive dependencies**: Quickly understand which inputs affect which outputs across your entire app\n- **🔍 Identify unused code**: Find reactive expressions and render functions that may no longer be used\n- **🗺️ Map data flow**: Visualize how data flows through complex Shiny applications with multiple modules\n- **📚 Generate documentation**: Create instant reference guides for new team members joining the project\n- **⚡ Optimize performance**: Identify potential bottlenecks by understanding reactive chains\n\n## 📦 Installation\n\nInstall from CRAN:\n\n``` r\ninstall.packages(\"shinyfa\")\n```\n\nOr install the development version from GitHub:\n\n``` r\n# Install from GitHub\ndevtools::install_github(\"dalyanalytics/shinyfa\")\n\n# Or using pak\npak::pak(\"dalyanalytics/shinyfa\")\n```\n\n## 🚀 Usage\n\n### Basic Example\n\nAnalyze a typical Shiny app structure:\n\n``` r\nlibrary(shinyfa)\nlibrary(dplyr)\n\n# Analyze server files in your Shiny app\nserver_files \u003c- list.files(\"my_shiny_app/server\", \n                          pattern = \"\\\\.R$\", \n                          full.names = TRUE, \n                          recursive = TRUE)\n\nfile_analysis \u003c- data.frame()\n\nfor (file in server_files) {\n  shiny_analysis \u003c- analyze_shiny_reactivity(file_path = file)\n  \n  if (is.null(shiny_analysis)) next\n  \n  shiny_analysis$file_name \u003c- basename(file)\n  file_analysis \u003c- bind_rows(file_analysis, shiny_analysis)\n}\n\n# View the analysis results\nprint(file_analysis)\n```\n\n### Example Output\n\n```\n#\u003e   type         name              inputs        output          file_name\n#\u003e 1 render       plotSales        c(\"dateRange\", \"product\")  plotOutput     sales_module.R\n#\u003e 2 reactive     filteredData     c(\"selectedRegion\")         NULL           data_processing.R  \n#\u003e 3 observe      updateFilters    c(\"input$reset\")            NULL           ui_helpers.R\n#\u003e 4 render       tableSummary     c(\"filteredData\")           tableOutput    summary_module.R\n#\u003e 5 observeEvent downloadHandler  c(\"input$download\")         NULL           download_handlers.R\n```\n\n### Analyzing Specific Patterns\n\n``` r\n# Find all reactive expressions that depend on a specific input\nfile_analysis %\u003e%\n  filter(type == \"reactive\", \n         grepl(\"dateRange\", inputs)) %\u003e%\n  select(name, file_name)\n\n# Identify potentially unused render functions\nfile_analysis %\u003e%\n  filter(type == \"render\",\n         is.na(output) | output == \"\")\n```\n\n## 🔍 Scope \u0026 Limitations\n\n- **File types**: Supports `.R` files \n- **Module support**: Works with both traditional Shiny apps and modularized applications\n- **Static analysis**: Performs static code analysis without running the app\n- **Pattern detection**: May not catch all edge cases or dynamically generated reactives\n\n## 🤝 Contributing\n\nContributions are welcomed! \n\n- Submit bug reports and feature requests via [GitHub Issues](https://github.com/dalyanalytics/shinyfa/issues)\n- Fork the repository and submit pull requests for improvements\n- Help us improve documentation and add more examples\n\n## 📄 License\n\nMIT © Jasmine Daly / shinyfa authors\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdalyanalytics%2Fshinyfa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdalyanalytics%2Fshinyfa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdalyanalytics%2Fshinyfa/lists"}