637 lines
17 KiB
Markdown
637 lines
17 KiB
Markdown
# Developer Laptop Manual Execution
|
||
|
||
This document explains how to manually run the SmartCane pipeline on a Windows developer machine, without the SOBIT Laravel job queue. This is the **primary workflow for development and testing**.
|
||
|
||
## Overview: Manual Execution Architecture
|
||
|
||
Instead of web UI buttons and job queues, developers execute R and Python scripts directly in PowerShell, controlling each stage manually.
|
||
|
||
```mermaid
|
||
%% Manual Execution Architecture
|
||
flowchart TD
|
||
A["Developer<br/>PowerShell Terminal"] -->|Edit params| B["parameters_project.R<br/>Set PROJECT, dates, paths"]
|
||
|
||
B -->|Run Stage 00| C["python 00_download_8band_pu_optimized.py<br/>Stage 00"]
|
||
|
||
C -->|Run Stage 10| D["Rscript 10_create_per_field_tiffs.R<br/>Stage 10"]
|
||
|
||
D -->|Run Stage 20| E["Rscript 20_ci_extraction_per_field.R<br/>Stage 20"]
|
||
|
||
E -->|Run Stage 30| F["Rscript 30_interpolate_growth_model.R<br/>Stage 30"]
|
||
|
||
F -->|Run Stage 40| G["Rscript 40_mosaic_creation_per_field.R<br/>Stage 40"]
|
||
|
||
G -->|Run Stage 80| H["Rscript 80_calculate_kpis.R<br/>Stage 80"]
|
||
|
||
H -->|Run Stage 90 OR 91| I{"Client Type?"}
|
||
|
||
I -->|agronomic_support| J["rmarkdown::render<br/>90_CI_report_*.Rmd"]
|
||
I -->|cane_supply| K["rmarkdown::render<br/>91_CI_report_*.Rmd"]
|
||
|
||
J -->|Output| L["Word Report<br/>Excel KPI Tables<br/>GeoTIFFs"]
|
||
K -->|Output| L
|
||
```
|
||
|
||
---
|
||
|
||
## Prerequisites & Environment Setup
|
||
|
||
### System Requirements
|
||
|
||
- **OS**: Windows 10+
|
||
- **R**: Version 4.4.0+ (from https://cran.r-project.org/)
|
||
- **Python**: Version 3.9+ (from https://www.python.org/)
|
||
- **RStudio**: Optional but recommended (for debugging)
|
||
|
||
### One-Time Configuration
|
||
|
||
#### Step 1: Install R Packages
|
||
|
||
```powershell
|
||
cd c:\Users\{YOUR_USERNAME}\Documents\SmartCane_code
|
||
|
||
# Run package manager to install/update all dependencies
|
||
& "C:\Program Files\R\R-4.4.3\bin\x64\Rscript.exe" r_app\package_manager.R
|
||
|
||
# This reads renv.lock and installs exact versions into renv/ folder
|
||
```
|
||
|
||
**What happens**:
|
||
- `package_manager.R` uses `renv::restore()` to install packages from `renv.lock`
|
||
- All packages isolated to project (not system-wide)
|
||
- Ensures reproducibility across team members
|
||
|
||
#### Step 2: Verify R Installation
|
||
|
||
```powershell
|
||
# Check R installation path
|
||
& "C:\Program Files\R\R-4.4.3\bin\x64\Rscript.exe" --version
|
||
|
||
# Should output: R version 4.4.3 (or similar)
|
||
```
|
||
|
||
#### Step 3: Verify Python Installation
|
||
|
||
```powershell
|
||
# Check Python
|
||
python --version
|
||
|
||
# Should output: Python 3.9.x or higher
|
||
|
||
# Create/activate virtual environment (optional but recommended)
|
||
python -m venv venv_smartcane
|
||
.\venv_smartcane\Scripts\Activate.ps1
|
||
|
||
# Install Python dependencies
|
||
pip install -r python_app\requirements_linux.txt
|
||
```
|
||
|
||
#### Step 4: Set Environment Variables (Optional)
|
||
|
||
```powershell
|
||
# Define R executable path as variable (for easier copy-paste)
|
||
$R_EXE = "C:\Program Files\R\R-4.4.3\bin\x64\Rscript.exe"
|
||
$PROJECT = "angata" # or "chemba", "aura", etc.
|
||
$END_DATE = "2026-02-19"
|
||
$OFFSET = 7
|
||
|
||
# Or add to PowerShell $PROFILE for persistence
|
||
# Add these lines to C:\Users\{YOUR_USERNAME}\Documents\PowerShell\profile.ps1
|
||
```
|
||
|
||
---
|
||
|
||
## Stage-by-Stage Execution
|
||
|
||
### Stage 00 (Optional): Download Satellite Imagery
|
||
|
||
**Purpose**: Fetch 4-band GeoTIFFs from Planet API
|
||
|
||
**When to run**:
|
||
- When you need fresh data (weekly or on-demand)
|
||
- Not needed if satellite TIFFs already in `merged_tif/` directory
|
||
|
||
**Command**:
|
||
|
||
```powershell
|
||
cd python_app
|
||
|
||
# Download for a specific date
|
||
python 00_download_8band_pu_optimized.py angata --date 2026-02-19
|
||
|
||
# Or use batch download for multiple dates
|
||
python download_planet_missing_dates.py --start 2025-12-24 --end 2026-02-19 --project angata
|
||
|
||
cd ..
|
||
```
|
||
|
||
**Expected Output**:
|
||
```
|
||
laravel_app/storage/app/angata/merged_tif/2026-02-19.tif (~200 MB)
|
||
```
|
||
|
||
**Troubleshooting**:
|
||
- **Auth error**: Check Planet API credentials in environment
|
||
- **Date missing**: Download script skips dates already saved
|
||
- **Cloud cover**: Script applies UDM1 cloud mask; may skip high-cloud days
|
||
|
||
---
|
||
|
||
### Stage 10: Create Per-Field Tiles
|
||
|
||
**Purpose**: Split merged farm TIFF into individual field files
|
||
|
||
**Prerequisite**:
|
||
- `merged_tif/2026-02-19.tif` must exist
|
||
- `Data/pivot.geojson` must exist and be valid
|
||
|
||
**Command**:
|
||
|
||
```powershell
|
||
$R_EXE = "C:\Program Files\R\R-4.4.3\bin\x64\Rscript.exe"
|
||
$PROJECT = "angata"
|
||
$END_DATE = "2026-02-19"
|
||
$OFFSET = 7
|
||
|
||
& $R_EXE r_app/10_create_per_field_tiffs.R $PROJECT $END_DATE $OFFSET
|
||
```
|
||
|
||
**Parameters**:
|
||
- `PROJECT`: Project name (angata, chemba, aura, etc.)
|
||
- `END_DATE`: Date in YYYY-MM-DD format
|
||
- `OFFSET`: Days to look back (7 = last week)
|
||
|
||
**Expected Output**:
|
||
```
|
||
laravel_app/storage/app/angata/field_tiles/
|
||
├── Field_001/
|
||
│ ├── 2026-02-12.tif (4-band)
|
||
│ ├── 2026-02-13.tif
|
||
│ └── 2026-02-19.tif
|
||
├── Field_002/
|
||
│ └── ...
|
||
└── ...
|
||
```
|
||
|
||
**Console Output**:
|
||
```
|
||
[1] "Loading parameters..."
|
||
[1] "Processing dates 2026-02-12 to 2026-02-19"
|
||
[1] "Field_001: splitting tile..."
|
||
[1] "Field_002: splitting tile..."
|
||
[1] "Stage 10 completed successfully"
|
||
```
|
||
|
||
---
|
||
|
||
### Stage 20: Extract Canopy Index (CI)
|
||
|
||
**Purpose**: Calculate CI per field and per pixel from 4-band TIFFs
|
||
|
||
**Prerequisite**:
|
||
- Stage 10 completed (`field_tiles/` populated)
|
||
- `Data/pivot.geojson` exists
|
||
|
||
**Command**:
|
||
|
||
```powershell
|
||
& $R_EXE r_app/20_ci_extraction_per_field.R $PROJECT $END_DATE $OFFSET
|
||
```
|
||
|
||
**Expected Output**:
|
||
```
|
||
laravel_app/storage/app/angata/field_tiles_CI/
|
||
├── Field_001/
|
||
│ ├── 2026-02-12.tif (5-band: R,G,B,NIR,CI)
|
||
│ └── 2026-02-19.tif
|
||
|
||
Data/extracted_ci/
|
||
├── daily_vals/
|
||
│ └── Field_001/
|
||
│ ├── 2026-02-12.rds
|
||
│ └── 2026-02-19.rds
|
||
└── cumulative_vals/
|
||
└── combined_CI_data.rds (WIDE format: fields × dates)
|
||
```
|
||
|
||
**Console Output**:
|
||
```
|
||
[1] "Computing CI index..."
|
||
[1] "Field_001: CI = 1.23 (mean), 0.45 (sd)"
|
||
[1] "Field_002: CI = 1.19 (mean), 0.38 (sd)"
|
||
[1] "Saving combined_CI_data.rds..."
|
||
[1] "Stage 20 completed successfully"
|
||
```
|
||
|
||
---
|
||
|
||
### Stage 30: Interpolate Growth Model
|
||
|
||
**Purpose**: Smooth CI time series and fill gaps (handles clouds)
|
||
|
||
**Prerequisite**:
|
||
- Stage 20 completed (`combined_CI_data.rds` exists)
|
||
- `Data/harvest.xlsx` recommended (required for cane_supply projects)
|
||
|
||
**Command**:
|
||
|
||
```powershell
|
||
# No date/offset parameters for Stage 30 — it processes all available CI data
|
||
& $R_EXE r_app/30_interpolate_growth_model.R $PROJECT
|
||
```
|
||
|
||
**Expected Output**:
|
||
```
|
||
Data/extracted_ci/cumulative_vals/
|
||
└── All_pivots_Cumulative_CI_quadrant_year_v2.rds
|
||
# (long format: field × date × interpolated_ci × daily_change × cumulative_ci)
|
||
```
|
||
|
||
**Console Output**:
|
||
```
|
||
[1] "Loading combined CI data..."
|
||
[1] "Applying LOESS interpolation (span=0.3)..."
|
||
[1] "Season 2025-10 → 2026-03: Field_001 interpolated 42 dates, filled 3 gaps"
|
||
[1] "Saving interpolated growth model..."
|
||
[1] "Stage 30 completed successfully"
|
||
```
|
||
|
||
---
|
||
|
||
### Stage 40: Create Weekly Mosaics
|
||
|
||
**Purpose**: Aggregate daily per-field TIFFs into weekly MAX-composites
|
||
|
||
**Prerequisite**:
|
||
- Stage 20 completed (`field_tiles_CI/` populated)
|
||
|
||
**Command**:
|
||
|
||
```powershell
|
||
# Process mosaics for END_DATE week, looking back OFFSET days
|
||
& $R_EXE r_app/40_mosaic_creation_per_field.R $END_DATE $OFFSET $PROJECT
|
||
```
|
||
|
||
**Expected Output**:
|
||
```
|
||
laravel_app/storage/app/angata/weekly_mosaic/
|
||
├── Field_001/
|
||
│ ├── week_07_2026.tif (5-band, MAX-aggregated for ISO week 7)
|
||
│ ├── week_06_2026.tif
|
||
│ └── ...
|
||
├── Field_002/
|
||
│ └── ...
|
||
```
|
||
|
||
**Console Output**:
|
||
```
|
||
[1] "Computing weekly mosaics for week 07 (2026-02-16 to 2026-02-22)..."
|
||
[1] "Field_001: aggregating 7 daily TIFFs..."
|
||
[1] "Field_002: aggregating 7 daily TIFFs..."
|
||
[1] "Saving weekly_mosaic/Field_001/week_07_2026.tif..."
|
||
[1] "Stage 40 completed successfully"
|
||
```
|
||
|
||
---
|
||
|
||
### Stage 80: Calculate KPIs
|
||
|
||
**Purpose**: Compute field-level KPIs from weekly mosaics (client-type dependent)
|
||
|
||
**Prerequisite**:
|
||
- Stage 40 completed (`weekly_mosaic/` populated)
|
||
- Stage 30 completed (growth model data for trends)
|
||
- `Data/pivot.geojson` exists
|
||
- `Data/harvest.xlsx` exists (required for cane_supply)
|
||
|
||
**Command**:
|
||
|
||
```powershell
|
||
# KPI calculation (client type determined from PROJECT name in parameters_project.R)
|
||
& $R_EXE r_app/80_calculate_kpis.R $END_DATE $PROJECT $OFFSET
|
||
```
|
||
|
||
**Expected Output**:
|
||
```
|
||
laravel_app/storage/app/angata/reports/
|
||
├── angata_field_analysis_week07_2026.xlsx (21-column spreadsheet)
|
||
└── kpis/
|
||
└── angata_kpi_summary_tables_week07.rds
|
||
```
|
||
|
||
**Console Output** (agronomic_support type):
|
||
```
|
||
[1] "Client type: agronomic_support"
|
||
[1] "Loading weekly mosaic data..."
|
||
[1] "Computing uniformity KPI (CV)..."
|
||
[1] "Computing area change KPI..."
|
||
[1] "Computing TCH forecast..."
|
||
[1] "Computing growth decline..."
|
||
[1] "Computing weed presence (Moran's I)..."
|
||
[1] "Computing gap fill quality..."
|
||
[1] "Saving kpi_summary_tables_week07.rds..."
|
||
[1] "Stage 80 completed successfully"
|
||
```
|
||
|
||
---
|
||
|
||
### Stages 90/91: Generate Word Reports
|
||
|
||
**Purpose**: Render RMarkdown to Microsoft Word (client-type specific)
|
||
|
||
**Prerequisite**:
|
||
- Stage 80 completed (KPI summary RDS + Excel exist)
|
||
- `Data/pivot.geojson` exists
|
||
- `Data/extracted_ci/cumulative_vals/combined_CI_data.rds` exists
|
||
|
||
**Command for Agronomic Support (Aura, Chemba, etc.)**:
|
||
|
||
```powershell
|
||
& $R_EXE -e `
|
||
"rmarkdown::render('r_app/90_CI_report_with_kpis_agronomic_support.Rmd', `
|
||
params=list(data_dir='$PROJECT', report_date=as.Date('$END_DATE')), `
|
||
output_file='SmartCane_Report_agronomic_support_${PROJECT}_week07_2026.docx', `
|
||
output_dir='laravel_app/storage/app/$PROJECT/reports')"
|
||
```
|
||
|
||
**Command for Cane Supply (Angata)**:
|
||
|
||
```powershell
|
||
& $R_EXE -e `
|
||
"rmarkdown::render('r_app/91_CI_report_with_kpis_cane_supply.Rmd', `
|
||
params=list(data_dir='$PROJECT', report_date=as.Date('$END_DATE')), `
|
||
output_file='SmartCane_Report_cane_supply_${PROJECT}_week07_2026.docx', `
|
||
output_dir='laravel_app/storage/app/$PROJECT/reports')"
|
||
```
|
||
|
||
**Expected Output**:
|
||
```
|
||
laravel_app/storage/app/angata/reports/
|
||
└── SmartCane_Report_cane_supply_angata_week07_2026.docx (Word file with tables, charts, maps)
|
||
```
|
||
|
||
**Console Output**:
|
||
```
|
||
[1] "Rendering RMarkdown..."
|
||
[1] "Loading KPI summary data..."
|
||
[1] "Loading weekly mosaics..."
|
||
[1] "Creating plots..."
|
||
[1] "Rendering Word document..."
|
||
[1] "Output: laravel_app/storage/app/angata/reports/SmartCane_Report_*.docx"
|
||
```
|
||
|
||
---
|
||
|
||
## Complete Pipeline: Single Command Sequence
|
||
|
||
### One-Liner Scripts (PowerShell)
|
||
|
||
**Setup Variables** (run once per session):
|
||
|
||
```powershell
|
||
$R_EXE = "C:\Program Files\R\R-4.4.3\bin\x64\Rscript.exe"
|
||
$PROJECT = "angata"
|
||
$END_DATE = "2026-02-19"
|
||
$OFFSET = 7
|
||
```
|
||
|
||
**Full Pipeline (if all data already downloaded)**:
|
||
|
||
```powershell
|
||
Write-Host "Starting SmartCane pipeline for $PROJECT on $END_DATE..."
|
||
|
||
# Stage 10
|
||
Write-Host "[Stage 10] Creating field tiles..."
|
||
& $R_EXE r_app/10_create_per_field_tiffs.R $PROJECT $END_DATE $OFFSET
|
||
|
||
# Stage 20
|
||
Write-Host "[Stage 20] Extracting CI..."
|
||
& $R_EXE r_app/20_ci_extraction_per_field.R $PROJECT $END_DATE $OFFSET
|
||
|
||
# Stage 30
|
||
Write-Host "[Stage 30] Interpolating growth model..."
|
||
& $R_EXE r_app/30_interpolate_growth_model.R $PROJECT
|
||
|
||
# Stage 40
|
||
Write-Host "[Stage 40] Creating weekly mosaics..."
|
||
& $R_EXE r_app/40_mosaic_creation_per_field.R $END_DATE $OFFSET $PROJECT
|
||
|
||
# Stage 80
|
||
Write-Host "[Stage 80] Calculating KPIs..."
|
||
& $R_EXE r_app/80_calculate_kpis.R $END_DATE $PROJECT $OFFSET
|
||
|
||
# Stage 90/91 (client-type dependent)
|
||
Write-Host "[Stage 90/91] Rendering report..."
|
||
$CLIENT_TYPE = "cane_supply" # Determine from parameters_project.R
|
||
if ($CLIENT_TYPE -eq "agronomic_support") {
|
||
$TEMPLATE = "r_app/90_CI_report_with_kpis_agronomic_support.Rmd"
|
||
} else {
|
||
$TEMPLATE = "r_app/91_CI_report_with_kpis_cane_supply.Rmd"
|
||
}
|
||
|
||
& $R_EXE -e `
|
||
"rmarkdown::render('$TEMPLATE', `
|
||
params=list(data_dir='$PROJECT', report_date=as.Date('$END_DATE')), `
|
||
output_file='SmartCane_Report_${PROJECT}_week07_2026.docx', `
|
||
output_dir='laravel_app/storage/app/$PROJECT/reports')"
|
||
|
||
Write-Host "Pipeline completed! Report: laravel_app/storage/app/$PROJECT/reports/"
|
||
```
|
||
|
||
### Batch Processing Multiple Weeks
|
||
|
||
**Use Batch Runner** (R script that loops weeks):
|
||
|
||
```powershell
|
||
# Aura batch processing (weeks 49–8, Dec 3 2025 - Feb 4 2026)
|
||
& $R_EXE -e "source('r_app/batch_pipeline_aura.R')"
|
||
|
||
# Manually loop custom date range
|
||
$startDate = [DateTime]::ParseExact("2026-01-28", "yyyy-MM-dd", $null)
|
||
$endDate = [DateTime]::ParseExact("2026-02-19", "yyyy-MM-dd", $null)
|
||
$current = $startDate
|
||
|
||
while ($current -le $endDate) {
|
||
$dateStr = $current.ToString("yyyy-MM-dd")
|
||
Write-Host "Processing week of $dateStr..."
|
||
|
||
& $R_EXE r_app/40_mosaic_creation_per_field.R $dateStr 7 "angata"
|
||
& $R_EXE r_app/80_calculate_kpis.R $dateStr "angata" 7
|
||
|
||
$current = $current.AddDays(7)
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Configuration: parameters_project.R
|
||
|
||
**Location**: `r_app/parameters_project.R`
|
||
|
||
This file defines global settings used by all stages.
|
||
|
||
```r
|
||
# ============================================================================
|
||
# SmartCane Project Configuration
|
||
# ============================================================================
|
||
|
||
# Project settings
|
||
PROJECT <- Sys.getenv("PROJECT") # Set by calling script or manually
|
||
if (PROJECT == "") {
|
||
PROJECT <- "angata" # Default project
|
||
}
|
||
|
||
# Client type mapping
|
||
CLIENT_TYPE_MAP <- list(
|
||
"angata" = "cane_supply",
|
||
"chemba" = "agronomic_support",
|
||
"xinavane" = "agronomic_support",
|
||
"esa" = "agronomic_support",
|
||
"simba" = "agronomic_support",
|
||
"aura" = "agronomic_support"
|
||
)
|
||
|
||
CLIENT_TYPE <- CLIENT_TYPE_MAP[[PROJECT]]
|
||
|
||
# Data directory (Laravel storage)
|
||
data_dir <- file.path(
|
||
dirname(getwd()), # Up one level from r_app
|
||
"laravel_app/storage/app",
|
||
PROJECT
|
||
)
|
||
|
||
# Key file paths
|
||
pivot_path <- file.path(data_dir, "Data", "pivot.geojson")
|
||
harvest_path <- file.path(data_dir, "Data", "harvest.xlsx")
|
||
merged_tif_dir <- file.path(data_dir, "merged_tif")
|
||
field_tiles_dir <- file.path(data_dir, "field_tiles")
|
||
field_tiles_ci_dir <- file.path(data_dir, "field_tiles_CI")
|
||
weekly_mosaic_dir <- file.path(data_dir, "weekly_mosaic")
|
||
|
||
# KPI thresholds (customizable)
|
||
CI_THRESHOLD <- 1.0
|
||
CV_GOOD <- 0.15
|
||
CV_EXCELLENT <- 0.08
|
||
CV_POOR <- 0.25
|
||
|
||
# Print configuration summary
|
||
cat("\n=== SmartCane Configuration ===\n")
|
||
cat("Project:", PROJECT, "\n")
|
||
cat("Client Type:", CLIENT_TYPE, "\n")
|
||
cat("Data Directory:", data_dir, "\n\n")
|
||
```
|
||
|
||
**How to Use**:
|
||
1. All scripts start with `source("parameters_project.R")`
|
||
2. Use global variables: `PROJECT`, `CLIENT_TYPE`, `data_dir`, etc.
|
||
3. To change project: Edit this file OR set `PROJECT` env var before running
|
||
|
||
---
|
||
|
||
## Troubleshooting Common Issues
|
||
|
||
### Issue: "File not found: combined_CI_data.rds"
|
||
|
||
**Cause**: Stage 20 not completed.
|
||
|
||
**Solution**:
|
||
```powershell
|
||
# Run Stage 20 again with correct date range
|
||
& $R_EXE r_app/20_ci_extraction_per_field.R angata 2026-02-19 7
|
||
```
|
||
|
||
### Issue: "Error in rmarkdown::render()"
|
||
|
||
**Cause**: RMarkdown template not found or missing dependencies.
|
||
|
||
**Solution**:
|
||
```powershell
|
||
# Check template file exists
|
||
Test-Path "r_app/90_CI_report_with_kpis_agronomic_support.Rmd"
|
||
|
||
# Reinstall R packages
|
||
& $R_EXE r_app/package_manager.R
|
||
```
|
||
|
||
### Issue: "GDAL error: Cannot open file"
|
||
|
||
**Cause**: Incorrect pivot.geojson path or file doesn't exist.
|
||
|
||
**Solution**:
|
||
```powershell
|
||
# Check pivot.geojson exists
|
||
Test-Path "laravel_app/storage/app/angata/Data/pivot.geojson"
|
||
|
||
# Verify path in parameters_project.R
|
||
```
|
||
|
||
### Issue: Python download fails with "Cloud cover too high"
|
||
|
||
**Cause**: Planet API filtering out days with >90% clouds.
|
||
|
||
**Solution**:
|
||
```powershell
|
||
# Check available dates in merged_tif directory
|
||
Get-ChildItem laravel_app/storage/app/angata/merged_tif/
|
||
|
||
# Or edit Python script to use permissive cloud threshold
|
||
# Line: cloud_cover_threshold = 0.95 # 95% clouds allowed
|
||
```
|
||
|
||
---
|
||
|
||
## Development Workflow Best Practices
|
||
|
||
### 1. Testing Single Stage in Isolation
|
||
|
||
```powershell
|
||
# Test Stage 20 without running full pipeline
|
||
$PROJECT = "angata"
|
||
$END_DATE = "2026-02-19"
|
||
$OFFSET = 7
|
||
|
||
# Prerequisite: Stage 10 must be done, or manually create field_tiles/
|
||
& $R_EXE r_app/20_ci_extraction_per_field.R $PROJECT $END_DATE $OFFSET
|
||
|
||
# Review output
|
||
Get-ChildItem laravel_app/storage/app/$PROJECT/field_tiles_CI/
|
||
|
||
# View CI values
|
||
$data <- readRDS("laravel_app/storage/app/$PROJECT/Data/extracted_ci/cumulative_vals/combined_CI_data.rds")
|
||
head(data)
|
||
```
|
||
|
||
### 2. Debugging RMarkdown
|
||
|
||
```powershell
|
||
# Render with verbose output
|
||
& $R_EXE -e `
|
||
"rmarkdown::render('r_app/90_CI_report_with_kpis_agronomic_support.Rmd', `
|
||
params=list(data_dir='aura', report_date=as.Date('2026-02-19')), `
|
||
knit_root_dir=getwd(), clean=FALSE)"
|
||
|
||
# Check intermediate files
|
||
Get-ChildItem r_app/ -Filter "*_files" -Directory
|
||
```
|
||
|
||
### 3. Using RStudio for Interactive Development
|
||
|
||
```powershell
|
||
# Open project in RStudio
|
||
# File > Open Project > r_app/r_app.Rproj
|
||
|
||
# Then in RStudio console:
|
||
# - source("parameters_project.R")
|
||
# - source("20_ci_extraction_per_field.R") # Run script line by line
|
||
# - debug(extract_ci_per_field) # Set breakpoints
|
||
```
|
||
|
||
---
|
||
|
||
## Next Steps
|
||
|
||
- See [ARCHITECTURE_DATA_FLOW.md](ARCHITECTURE_DATA_FLOW.md) for understanding pipeline flow
|
||
- See [CLIENT_TYPE_ARCHITECTURE.md](CLIENT_TYPE_ARCHITECTURE.md) for client-specific KPI differences
|
||
- See [SOBIT_DEPLOYMENT.md](SOBIT_DEPLOYMENT.md) for production server alternative
|
||
- See [ARCHITECTURE_INTEGRATION_GUIDE.md](ARCHITECTURE_INTEGRATION_GUIDE.md) for choosing execution model
|