The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.
contextFind is a convenient code search tool designed
for R developers who work with multi-file projects such as Shiny
applications, R packages, or complex analysis workflows. Unlike basic
text search, contextFind provides:
Install from CRAN:
Or get the development version from GitHub:
The core function contextFind() searches for text across
your R and Rmd files:
library(contextFind)
# Search for all function definitions in your project
contextFind("<- function")This will output results like:
Found 15 matches for "<- function"
==============================
Match 15 of 15
server.R (line 42)
Last Modified: 2024-10-15 14:32:10
------------------------------
Line 40:
Line 41: # Define server logic
Line 42: server <- function(input, output, session) {
Line 43:
Line 44: # Reactive values
Each match shows: - File name and line number (clickable in supported terminals) - Last modification time of the file - Context lines around the match (default: 2 before and 2 after) - The matching line highlighted
Control how much surrounding code to display:
Limit your search to specific directories:
The contextFind package includes an RStudio addin that
provides an interactive interface for searching your code.
Install and restart RStudio after installing
contextFind
Assign a keyboard shortcut:
Ctrl+Shift+F or
Cmd+Shift+F on Mac)The addin will pre-fill the search box with any highlighted text, making it fast to search for variables or function names you’re currently working with.
contextFind() invisibly returns a list of results that
you can work with:
# Store results
results <- contextFind("ggplot")
# Access the first match
results[[1]]$file # Full file path
results[[1]]$match_line # Line number where match was found
results[[1]]$mtime # File modification time
results[[1]]$context # Named character vector of context lines
# Get all matching files
unique(sapply(results, function(x) x$file))
# Count matches per file
table(sapply(results, function(x) basename(x$file)))
# Find most recently modified files with matches
recent <- results[[length(results)]]
cat("Most recent match in:", basename(recent$file),
"at line", recent$match_line, "\n")Since contextFind uses literal string matching (not
regex), you can search for partial code patterns:
Search for recent changes in modified files:
The results are sorted by modification time, so your recent changes appear last - right where you’re reading in the console.
Use the function in scripts or reports:
# Find all functions that need documentation
results <- contextFind("<- function", contextLines = 0)
# Check if they have roxygen comments
documented <- sapply(results, function(r) {
lines <- readLines(r$file)
line_before <- lines[max(1, r$match_line - 1)]
grepl("#'", line_before)
})
cat(sprintf("%d of %d functions have documentation\n",
sum(documented), length(documented)))Remember that contextFind is case-sensitive:
While contextFind searches both .R and .Rmd files
automatically, you can narrow results by path:
# Search for roxygen @export tags
results <- contextFind("@export", path = "R/")
# Find what functions are exported
exported_functions <- sapply(results, function(r) {
lines <- readLines(r$file)
# Look ahead for function definition
func_line <- lines[r$match_line + 1]
if (grepl("<- function", func_line)) {
trimws(gsub("<-.*", "", func_line))
} else {
NA
}
})
cat("Exported functions:\n")
print(na.omit(exported_functions))# Count UI elements
ui_results <- contextFind("Input(", path = ".")
cat("Number of input widgets:", length(ui_results), "\n")
# Count outputs
output_results <- contextFind("render", path = ".")
cat("Number of render functions:", length(output_results), "\n")
# Find reactive chains
contextFind("reactive(")
contextFind("observe(")If contextFind returns no results:
path parameter points to the correct
directoryrecursive = TRUE if searching
subdirectoriesTo narrow down results:
path = "R/"recursive = FALSE for current directory onlycontextLines to see less contextClickable links require:
file://
linksFound a bug or have a feature request? Please visit the GitHub repository to open an issue or submit a pull request.
These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.