Extract names of dataframes passed with dots
Asked Answered
L

3

12

One can use deparse(substitute()) combination to extract the parameter name inside the function like this function

names_from_dots <- function(...) {
    deparse(substitute(...))
 }

data(iris)
data(swiss)

names_from_dots(iris)
#[1] "iris"
names_from_dots(swiss)
#[1] "swiss"

extracts the name of a data.frame passed in ... (dots) parameter.

But how can one extract every name of passed multiple data.frames

names_from_dots(swiss, iris)
[1] "swiss"
names_from_dots(iris, swiss)
[1] "iris"

When this only returns the name of the first object.

Leishmaniasis answered 10/2, 2016 at 14:16 Comment(0)
G
7

You can try the following:

names_from_dots <- function(...) sapply(substitute(list(...))[-1], deparse)

names_from_dots(swiss, iris)
# [1] "swiss" "iris" 
Gail answered 10/2, 2016 at 14:27 Comment(0)
A
19

I wouldn’t use substitute here at all, it works badly with ...1. Instead, you can just capture the unevaluated dots using:

dots = match.call(expand.dots = FALSE)$...

Then you can get the arguments inside the dots:

sapply(dots, deparse)

1 Part of the reason is, I think, that substitute does completely different things when called with (a) an argument (which is a “promise” object) or (b) another object. ... falls somewhere in between these two.

Amoy answered 10/2, 2016 at 14:32 Comment(0)
G
7

You can try the following:

names_from_dots <- function(...) sapply(substitute(list(...))[-1], deparse)

names_from_dots(swiss, iris)
# [1] "swiss" "iris" 
Gail answered 10/2, 2016 at 14:27 Comment(0)
H
1

Another alternative, using the rlang package (based on H. Wickham, Advanced R, Section 19.3.2):

names_from_dots <- function(...) as.character(rlang::ensyms(...))
names_from_dots(swiss, iris)
# [1] "swiss" "iris" 
Hindbrain answered 28/9, 2023 at 18:3 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.