| Type: | Package | 
| Title: | Design on-Farm Precision Field Agronomic Trials | 
| Version: | 0.1.3 | 
| Maintainer: | Taro Mieno <tmieno2@unl.edu> | 
| URL: | https://difm-brain.github.io/ofpetrial/ | 
| BugReports: | https://github.com/DIFM-Brain/ofpetrial/issues | 
| Description: | A comprehensive system for designing and implementing on-farm precision field agronomic trials. You provide field data, tell 'ofpetrial' how to design a trial, and get readily-usable trial design files and a report checks the validity and reliability of the trial design. | 
| License: | GPL (≥ 3) | 
| Encoding: | UTF-8 | 
| LazyData: | true | 
| RoxygenNote: | 7.3.2 | 
| Imports: | data.table, ggplot2, sf, lwgeom, purrr, tidyr, tibble, ggpubr, ggExtra, terra, zip, rmarkdown, tmap, magrittr, dplyr, bookdown, leaflet | 
| VignetteBuilder: | knitr | 
| Depends: | R (≥ 4.1.0) | 
| Suggests: | knitr | 
| NeedsCompilation: | no | 
| Packaged: | 2025-09-22 19:01:28 UTC; taromieno | 
| Author: | Taro Mieno | 
| Repository: | CRAN | 
| Date/Publication: | 2025-09-22 19:30:02 UTC | 
ofpetrial: Design on-Farm Precision Field Agronomic Trials
Description
A comprehensive system for designing and implementing on-farm precision field agronomic trials. You provide field data, tell 'ofpetrial' how to design a trial, and get readily-usable trial design files and a report checks the validity and reliability of the trial design.
Author(s)
Maintainer: Taro Mieno tmieno2@unl.edu (ORCID) [copyright holder]
Authors:
- Brittani Edge bedge2@illinois.edu (ORCID) [contributor] 
See Also
Useful links:
- Report bugs at https://github.com/DIFM-Brain/ofpetrial/issues 
Pipe operator
Description
See magrittr::%>% for details.
Usage
lhs %>% rhs
Arguments
| lhs | A value or the magrittr placeholder. | 
| rhs | A function call using the magrittr semantics. | 
Value
The result of calling 'rhs(lhs)'.
Add blocks to trial design
Description
Delineate blocks on a trial design and assign block id to all the plots
Usage
add_blocks(td)
Arguments
| td | trial design made by applying assign_rates() to experimental plots made by make_exp_plots() | 
Value
trial design with block_id added
Examples
#--- load rate information ---#
data(td_single_input)
#--- add blocks ---#
td_with_blocks <- add_blocks(td_single_input)
#--- take a look ---#
td_with_blocks$trial_design
#--- visualize ---#
viz(td_with_blocks, type = "block_id")
Assign rates to the plots of experimental plots
Description
This functions assign input rates for the plots created by make_exp_plots() according to the rate designs specified by the user in rate_info, which can be created by prep_rateingle().
Usage
assign_rates(exp_data, rate_info)
Arguments
| exp_data | experiment plots created by make_exp_plots() | 
| rate_info | rate information created by prep_rate() | 
Value
trial design as sf (experiment plots with rates assigned)
Examples
#--- load experiment plots made by make_exp_plots() ---#
data(exp_data)
exp_data
#--- load rate information ---#
data(rate_info)
rate_info
#--- assign rates ---#
td <- assign_rates(exp_data, rate_info)
#--- visualization of the assigned rates ---#
viz(td)
Assign rates to the plots of experimental plots for a single input based on existing trial designs created by assign_rates()
Description
This functions assign input rates for the plots created by make_exp_plots() for a single input according to the rate design specified by the user in rate_info. It assigns rates to the input so that the resulting design avoids significant correlation with the rate of another input specified as existing_design.
Usage
assign_rates_conditional(exp_data, rate_info, existing_design)
Arguments
| exp_data | experiment plots created by make_exp_plots() | 
| rate_info | rate information created by prep_rate() | 
| existing_design | trial design of another input created with assign_rates() | 
Value
trial design as sf (experiment plots with rates assigned)
Examples
#--- load experiment plots made by make_exp_plots() ---#
data(td_single_input)
exp_data
seed_plot_info <-
 prep_plot(
   input_name = "seed",
   unit_system = "imperial",
   machine_width = 60,
   section_num = 24,
   harvester_width = 30,
   plot_width = 30
 )
exp_data <-
 make_exp_plots(
   input_plot_info = seed_plot_info,
   boundary_data = system.file("extdata", "boundary-simple1.shp", package = "ofpetrial"),
   abline_data = system.file("extdata", "ab-line-simple1.shp", package = "ofpetrial"),
   abline_type = "free"
 )
seed_rate_info <-
 prep_rate(
   plot_info = seed_plot_info,
   gc_rate = 32000,
   unit = "seed",
   min_rate = 16000,
   max_rate = 40000,
   num_rates = 5,
   design_type = "ls"
 )
assign_rates_conditional(
 exp_data = exp_data, 
 rate_info = seed_rate_info, 
 existing_design = td_single_input
)
Change the assigned rates
Description
Change the assigned rates by plot and strip
Usage
change_rates(
  td,
  input_name = NA,
  strip_ids,
  plot_ids = NULL,
  new_rates,
  rate_by = "all"
)
Arguments
| td | trial design | 
| input_name | (character) input name | 
| strip_ids | (numeric) vector of strip_ids | 
| plot_ids | (numeric) vector of plot_ids | 
| new_rates | (numeric) single numeric number for 'rate_by = "all"“, a vector of numeric values for 'rate_by = "strip"“, a matrix of numeric numbers for 'rate_by = "plot"'. | 
| rate_by | (character) default is "all". The other options are "plot" and "strip". | 
Value
trial design with changed rates
Examples
#--- load rate information ---#
data(td_single_input)
#--- change rates of some strips ---#
strip_ids <- 1:5
plot_ids <- 5:10
new_rates <- 200
td_modified <- change_rates(td_single_input, "NH3", strip_ids, plot_ids, new_rates)
#--- visualize ---#
viz(td_modified)
Check the alignment of harvester and applicator/planter
Description
Check the alignment of harvester and applicator/planter for mixed treatment problems where multiple input rates are associated with yield monitor data
Usage
check_alignment(td)
Arguments
| td | trial design data created by make_exp_plots() and assign_rates() | 
Value
a tibble
Examples
#--- load trial design ---#
data(td_single_input)
#--- check the alignment of harvester and applicator/planter ---#
machine_alignment <- check_alignment(td_single_input)
#--- check the degree of mixed treatment problem ---#
machine_alignment$overlap_data
#--- visualize the degree of mixed treatment problem ---#
machine_alignment$g_overlap[[1]]
Check the correlation of the two inputs
Description
Check the correlation between the rates of the two inputs for a two-input experiment.
Usage
check_ortho_inputs(td)
Arguments
| td | trial design for a two-input experiment with rates assigned | 
Value
table
Examples
#--- load a trial design for a two-input experiment ---#
data(td_two_input)
#--- check correlation ---#
check_ortho_inputs(td_two_input)
Check the orthogonality with field/topographic characteristics
Description
Check the orthogonality of the trial input rates and observed characteristics provided by the user
Usage
check_ortho_with_chars(td, sp_data_list, vars_list)
Arguments
| td | (tibble) trial design data created by make_exp_plots() and assign_rates() | 
| sp_data_list | (list) list of spatial datasets as 'sf' from the 'sf' package or 'SpatRaster' from the 'terra' package | 
| vars_list | (list) list of character vectors indicating the name of the variables to be used in the datasets specified in sp_data_list | 
Value
a list
Examples
data(td_single_input)
ssurgo_sf <-
  sf::st_read(system.file("extdata", "ssurgo-simple1.shp", package = "ofpetrial")) %>%
  dplyr::mutate(mukey = factor(mukey))
checks <-
  check_ortho_with_chars(
    td = td_single_input,
    sp_data_list = list(ssurgo_sf),
    vars_list = list("clay")
  )
checks$summary_data[[1]]
checks$summary_fig[[1]]
Experiment data
Description
Data on the experiment created by running the 'make_exp_plot()' function, which includes various sf objects (e.g., experiment plots, ab-line, headland, etc). This data exists only for the purpose of making examples in some function references succinct.
Usage
exp_data
Format
tbl_df tbl data.frame 'exp_data' A data frame with 1 rows and 9 columns:
- input_name
- input name 
- harvester_width
- width of the harvester 
- plot_width
- width of the plots to be made 
- field_sf
- field boundary as an sf object 
- headland
- headland as an sf object 
- exp_plots
- experiment plots as an sf object 
- ab_lines
- ab-lines for the applicator/planter as an sf object 
- harvest_ab_lines
- ab-lines for the harvester as an sf object 
- abline_type
- (character) one of "free", "lock", "none" indicating the way ab-line is (or not) created 
Make experimental plots/strips inside the field boundary
Description
Make experimental plots/strips inside the field boundary, harvester ab-line, and applicator/planter ab-line.
Usage
make_exp_plots(
  input_plot_info,
  boundary_data,
  abline_data = NA,
  abline_type = "free"
)
Arguments
| input_plot_info | (data.fram or a list of two data.frames) list of plot information created by make_input_plot() | 
| boundary_data | (character) path of the field boundary file or boundary as an sf | 
| abline_data | (character or sf) path of the ab-line file or ab-line as an sf | 
| abline_type | (character) the type of ab-line generation. Select from "free", "lock", and "none" | 
Value
a tibble that include experimental plots as sf
Examples
n_plot_info <-
  prep_plot(
    input_name = "NH3",
    unit_system = "imperial",
    machine_width = 60,
    section_num = 1,
    harvester_width = 30,
    headland_length = 30,
    side_length = 60
  )
exp_data <-
  make_exp_plots(
    input_plot_info = n_plot_info,
    boundary_data = system.file("extdata", "boundary-simple1.shp", package = "ofpetrial"),
    abline_data = system.file("extdata", "ab-line-simple1.shp", package = "ofpetrial"),
    abline_type = "free"
  )
exp_data$exp_plots
Create trial design report
Description
This function creates an html report describing the trial design created by the user with assign_rates() and includes figures showing machine alignment
Usage
make_trial_report(td, folder_path, trial_name = NA, keep_rmd = FALSE)
Arguments
| td | trial design created by assign_rates() | 
| folder_path | (character) path to the folder in which the report will be saved | 
| trial_name | (character) name of trial to be used in report | 
| keep_rmd | (logical) If FALSE (Default), the original rmd file will be deleted upon creating an html report. Otherwise, the rmd file will be saved in the folder specified by 'folder_path'. | 
Value
path to the resulting html file (invisible)
Examples
#--- load experiment made by assign_rates() ---#
data(td_single_input)
make_trial_report(
  td = td_single_input,
  folder_path = tempdir()
)
Plot information
Description
Plot information for creating experiment plots using 'make_exp_plot()'. This data exists only for the purpose of making examples in some function references succinct.
Usage
plot_info
Format
data.frame 'plot_info' A data frame with 1 rows and 10 columns:
- input_name
- input name 
- unit_system
- measurement system (metric or imperial) 
- machine_width
- width of the applicator/planter 
- section_num
- number of the sections of the machine 
- section_width
- width of a section of the machine 
- harvester_width
- width of the harvester 
- plot_width
- width of the plots to be made 
- headland_length
- length of the headland 
- side_length
- length of the side 
- min_plot_length
- minimum plot length allowed 
- max_plot_length
- maximum plot length allowed 
Prepare plot information for a single-input experiment (length in meter)
Description
Prepare plot information for a single-input experiment case. All the length values need to be specified in meter.
Usage
prep_plot(
  input_name,
  unit_system,
  machine_width,
  section_num,
  harvester_width,
  plot_width = NA,
  headland_length = NA,
  side_length = NA,
  max_plot_width = NA,
  min_plot_length = NA,
  max_plot_length = NA
)
Arguments
| input_name | (character) Input name | 
| unit_system | (character) A character of either 'metric' or 'imperial' indicating the system of measurement used | 
| machine_width | (numeric) A numeric number in units specified in unit_system that indicates the width of the applicator or planter of the input | 
| section_num | (numeric) A numeric number that indicates the number of sections of the applicator or planter of the input | 
| harvester_width | (numeric) A numeric number that indicates the width of the harvester | 
| plot_width | (numeric) Default is c(NA, NA). | 
| headland_length | (numeric) A numeric number that indicates the length of the headland (how long the non-experimental space is in the direction machines drive). Default is NA. | 
| side_length | (numeric) A numeric number that indicates the length of the two sides of the field (how long the non-experimental space is in the direction perpendicular to the direction of machines). Default is NA. | 
| max_plot_width | (numeric) Maximum width of the plots. Default is 36.576 meter (120 feet). | 
| min_plot_length | (numeric) Minimum length of the plots. Default is 73.152 meter (240 feet). | 
| max_plot_length | (numeric) Maximum length of the plots. Default is 91.440 meter (300 feet) | 
Value
a tibble with plot information necessary to create experiment plots
Examples
input_name <- "seed"
unit_system <- "metric"
machine_width <- 12
section_num <- 12
plot_width <- NA
harvester_width <- 24
prep_plot(input_name, unit_system, machine_width, section_num, harvester_width)
Create data of input rate information for a single input
Description
Create data of input rate information for a single input with some checks on the validity of the information provided by the user. This can be used to assign rates to experiment plots using assign_rates().
Usage
prep_rate(
  plot_info,
  gc_rate,
  unit,
  rates = NULL,
  min_rate = NA,
  max_rate = NA,
  num_rates = 5,
  design_type = NA,
  rank_seq_ws = NULL,
  rank_seq_as = NULL,
  rate_jump_threshold = NA
)
Arguments
| plot_info | (data.frame) plot information created by make_input_plot_data | 
| gc_rate | (numeric) Input rate the grower would have chosen if not running an experiment. This rate is assigned to the non-experiment part of the field. This rate also becomes one of the trial input rates unless you specify the trial rates directly using rates argument | 
| unit | (string) unit of input | 
| rates | (numeric vector) Default is NULL. Sequence of trial rates in the ascending order. | 
| min_rate | (numeric) minimum input rate. Ignored if rates are specified. | 
| max_rate | (numeric) maximum input rate. Ignored if rates are specified | 
| num_rates | (numeric) Default is 5. It has to be an even number if design_type is "ejca". Ignored if rates are specified. | 
| design_type | (string) type of trial design. available options are Latin Square ("ls"), Strip ("str"), Randomized Strip ("rstr"), Randomized Block ("rb"), Sparse ("sparse"), and Extra Jump-conscious Alternate "ejca". See the article on trial design for more details. | 
| rank_seq_ws | (integer) vector of integers indicating the order of the ranking of the rates, which will be repeated "within" a strip. | 
| rank_seq_as | (integer) vector of integers indicating the order of the ranking of the rates, which will be repeated "across" strip for their first plots. | 
| rate_jump_threshold | (integer) highest jump in rate rank acceptable | 
Value
data.frame of input rate information
Examples
plot_info <-
  prep_plot(
    input_name = "seed",
    unit_system = "imperial",
    machine_width = 60,
    section_num = 24,
    harvester_width = 30,
    plot_width = 30
  )
prep_rate(
  plot_info,
  gc_rate = 30000,
  unit = "seeds",
  rates = c(20000, 25000, 30000, 35000, 40000)
)
Rate information
Description
Rate information for assigning rates to the experiment plots using the 'assign_rates()' function. This data exists only for the purpose of making examples in some function references succinct.
Usage
rate_info
Format
data.frame 'rate_info' A data frame with 1 rows and 7 columns:
- input_name
- input name 
- design_type
- type of the trial design to be created 
- gc_rate
- normal rate the grower would have used if not running an experiment 
- unit
- unit of the input 
- rates_data
- data.frame of rates and their ranks 
- rank_seq_ws
- vector of the ranking of rates that will repeated within a strip 
- rank_seq_as
- vector of the ranking of rates that will repeated as the first rate of the strips 
Trial design (single-input) for a curved field
Description
Trial design data created by assigning rates to experiment plots running the 'assign_rates()' function. This data exists only for the purpose of making examples in some function references succinct.
Usage
td_curved
Format
tbl_df tbl data.frame 'td_curved' A data frame with 1 rows and 9 columns:
- input_name
- input name 
- input_type
- shorthand for the type of the input: "N" for nitrogen, "S" for seed, etc. 
- trial_design
- experiment plots with input rats assigned as an sf object 
- design_type
- type of the trial design used 
- unit
- unit of the input 
- abline_type
- (character) one of "free", "lock", "none" indicating the way ab-line is (or not) created 
- ab_lines
- ab-lines for the applicator/planter as an sf object 
- harvest_ab_lines
- ab-lines for the harvester as an sf object 
- field_sf
- field boundary as an sf object 
- harvest_width
- width of the harvester 
Trial design (single-input)
Description
Trial design data created by assigning rates to experiment plots running the 'assign_rates()' function. This data exists only for the purpose of making examples in some function references succinct.
Usage
td_single_input
Format
tbl_df tbl data.frame 'td_single_input' A data frame with 1 rows and 9 columns:
- input_name
- input name 
- input_type
- shorthand for the type of the input: "N" for nitrogen, "S" for seed, etc. 
- trial_design
- experiment plots with input rats assigned as an sf object 
- design_type
- type of the trial design used 
- unit
- unit of the input 
- abline_type
- (character) one of "free", "lock", "none" indicating the way ab-line is (or not) created 
- ab_lines
- ab-lines for the applicator/planter as an sf object 
- harvest_ab_lines
- ab-lines for the harvester as an sf object 
- field_sf
- field boundary as an sf object 
- harvest_width
- width of the harvester 
Trial design (two-input)
Description
Trial design data created by assigning rates to experiment plots running the 'assign_rates()' function. This data exists only for the purpose of making examples in some function references succinct.
Usage
td_two_input
Format
tbl_df tbl data.frame 'td_two_input' A data frame with 1 rows and 9 columns:
- input_name
- input name 
- input_type
- shorthand for the type of the input: "N" for nitrogen, "S" for seed, etc. 
- trial_design
- experiment plots with input rats assigned as an sf object 
- design_type
- type of the trial design used 
- unit
- unit of the input 
- abline_type
- (character) one of "free", "lock", "none" indicating the way ab-line is (or not) created 
- ab_lines
- ab-lines for the applicator/planter as an sf object 
- harvest_ab_lines
- ab-lines for the harvester as an sf object 
- field_sf
- field boundary as an sf object 
- harvest_width
- width of the harvester 
Visualize various aspects of a trial design
Description
Create plots of experiment rates, plot layout, plot_id, strip_id, and block_id, which can be specified by the 'type' argument.
Usage
viz(
  td,
  type = "rates",
  input_index = c(1, 2),
  text_size = 3,
  abline = FALSE,
  leaflet = FALSE
)
Arguments
| td | (tibble) experiment plots made by make_exp_plots() | 
| type | (character) type of plots to create. Available options are "rates", "layout", "plot_id", "strip_id", "block_id", "ab_line" | 
| input_index | (numeric) a vector of length 1 or 2. 1 means the 1st input of the td, 2 means the second input of the td, and c(1, 2) means both of the inputs, which is the DEFAULT | 
| text_size | (numeric) the size of plot ID, strip ID, and block ID numbers printed in the plots | 
| abline | (logical) If TRUE, ab-lines are displayed as well. Default = FALSE. This applies only ton type = "rates" and type = "layout". | 
| leaflet | (logical) If TRUE, the plot will be superimposed on a satellite imagery of the field. Default is FALSE. This option is effective only for type = "rates". | 
Value
ggplot or leaflet (if leaflet == TRUE) object
Examples
#--- load trial design ---#
data(td_two_input)
viz(td_two_input)
Write trial design files for field implementation
Description
Write out all the necessary files to implement the trial design created. Exported files include
Usage
write_trial_files(td, folder_path, ext = "shp", zip = FALSE, zip_name = NA)
Arguments
| td | (tibble) a tibble of a trial design created by applying assign_rate() to experimental plots made by make_exp_plots(). | 
| folder_path | (character) path to the folder in which the files will be saved | 
| ext | (character) Default = "shp". Extension to use to save the files, "geojson" or any other extension supported by sf::st_write() | 
| zip | (logical) Default = FALSE. If TRUE, all the files that are being written will be zipped. | 
| zip_name | (character) name of the zip file created when zip = TRUE. | 
Value
nothing
Examples
#--- load trial design ---#
data(td_two_input)
write_trial_files(
  td = td_two_input,
  folder_path = tempdir(),
  zip = FALSE
)