El código

foo <- function(df, column.name){
    if (!column.name %in% colnames(df))
      stop("Column ", column.name, " not found in ", deparse(substitute(df)))
    mean(df$column.name)  # por ejemplo
  }

foo(iris, "petal.area")

lanza el error

Error in foo(iris, "petal.area") : Column petal.area not found in iris

que es mucho más informativo gracias a la acción combinada de deparse + substitute.

En particular, substitute evita que R resuelva el valor de df, es decir, devuelve un símbolo, la referencia a df, en lugar de su contenido. Luego, deparse transforma ese símbolo en su representación textual, en el nombre del objeto.