0

I would like to create an R function called "test" with a single argument "object" which can be either a data frame or a list of data frames :

  • if object is a data frame, test() must return the name of the data frame as a string
  • if object is a list, test() must return a vector of strings where each element is the name of the data frames.

I would like test() to work with pipes %>% and |>.

What I tried :

test <- function(object) {
  return(deparse(substitute(object)))
}

# must return "iris"
iris |> test()
# must return "iris" "mtcars"
list(iris,mtcars) |> test()

Unfortunately with my test, it gives this :

> list(iris,mtcars) |> essai()
[1] "list(iris, mtcars)"
Damien Dotta
  • 771
  • 3
  • 13

2 Answers2

1
test <- function(object) {
  if (class(object) == "list") {
    unlist(lapply(substitute(object), \(x) deparse(x)))[-1]
  } else {
    deparse(substitute(object))
  }
}

iris |> test()
# [1] "iris"

list(iris,mtcars) |> test()
# [1] "iris"   "mtcars"
Merijn van Tilborg
  • 5,452
  • 1
  • 7
  • 22
-1

Updated code:

test <- function(object) {
  if (class(object) == "data.frame") {
    return(deparse(substitute(object)))
  } else if (class(object) == "list") {
    return(unlist(lapply(object, function(x) deparse(substitute(x)))))
  } else {
    stop("Input must be a data frame or a list of data frames.")
  }
}

# must return "iris"
test(iris)
# must return c("iris", "mtcars")
test(list(iris, mtcars))

      
Talha Asif
  • 349
  • 1
  • 9