2016-09-14 4 views
0

В простой функции с помощью ... предоставить список аргументов, возможно для этой функции, чтобы найти имен из объектов, передаваемых из вызова Окружающая среда? Если да, то как?R: получить имена аргументов, переданных в `...`

Это возникает в контексте вопроса, printing matrices and vectors side by side, но, вероятно, является более общим.

В этом контексте аргументы ... также могут содержать символьные строки, для которых имена не требуются. Вот мой MWE, где я пробовал использовать deparse(substitute()), но безрезультатно.

test_names <- function(...) { 
    # get arguments 
    args <- list(...) 
    chars <- sapply(args, is.character) 
    names <- sapply(args, function(x) if(is.character(x)) " " else deparse(substitute(x))) 
    names 
} 

Тест:

A = matrix(c(0.5, 1, 3, 0.75, 2.8, 4), nrow = 2) 
x = c(0.5, 3.7, 2.3) 
y = c(0.7, -1.2) 
b = A %*% x - y 

> test_names(A, " * ", x, " - ", y, " = ", b) 
[1] "X[[i]]" " "  "X[[i]]" " "  "X[[i]]" " "  "X[[i]]" 
> 

Мой желаемый результат для этого будет характер вектор длины 7:

[1] "A" " " "x" " " "y" " " "b" 

Удивительно здесь, что результаты являются все X[[i]], когда нет X упомянутый везде.

После @ ответ Роланда, это, кажется, делать то, что я хочу:

test_names2 <- function(...) { 
    argnames <- sys.call() 
    unlist(lapply(argnames[-1], as.character)) 
} 

> test_names2(A, " * ", x, " - ", y, " = ", b) 
[1] "A" " * " "x" " - " "y" " = " "b" 
+0

Вы получаете их от лапы. Он не сохраняет имена списков. – Roland

+0

Отредактировано для отображения желаемого результата – user101089

ответ

1

Использование sys.call:

test_names <- function(...) { 
    argnames <- sys.call() 
    paste(lapply(argnames[-1], as.character), collapse = "") 
} 
#[1] "A * x - y = b" 
0

Как список адресов электронной почты описывает (here) либо sys.call, как сказал Роланд или match.call можете для этого.

По сравнению с раствором Роланда, раствор с match.call выглядит

f = function(...){ 
    return(match.call()) 
} 

d = f(x = 1, b = 5) 
d 
#f(x = 1, b = 5) 
as.list(d[-1]) 
#$x 
#[1] 1 
# 
#$b 
#[1] 5 

Поэтому использовать его несколько, как это, потому что первый элемент является именем самой функции.

f = function(...){ 
    return(as.list(match.call())[-1]) 
} 

Они похожи, но help page говорит:

sys.call() аналогична [к match.call()], но не расширяет аргумент имена;

Итак, вот одна разница.

Смежные вопросы