Получить имя переменной, возвращаемой функцией R

У меня есть этот код:

library(magrittr)
a <- function(cars) return(cars)
b <- function(x) return(list(varname = deparse(substitute(x)), content = x))

b(cars) возвращает список со строкой cars и содержание data.frame cars,

Любой способ получить a(cars) %>% b() также вернуть строку cars (имя переменной, возвращаемой функцией a()) и содержание data.frame?

Вместо этого он возвращает . и содержание data.frame.

То есть я хотел бы, чтобы вторая функция возвращала имя переменной, возвращаемой первой функцией, а также содержимое переменной.

Что я на самом деле хочу сделать с b() это что-то вроде write.csv(x, paste0(deparse(substitute(x)), ".csv")),

Какие-либо предложения?

1 ответ

Решение

Если вы посмотрите на стек вызовов внутри %>% операторы, вы получите что-то вроде этого

a(cars) %>% (function(x) sys.calls())

# [[1]]
# a(cars) %>% (function(x) sys.calls())
# [[2]]
# withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
# [[3]]
# eval(quote(`_fseq`(`_lhs`)), env, env)
# [[4]]
# eval(expr, envir, enclos)
# [[5]]
# `_fseq`(`_lhs`)
# [[6]]
# freduce(value, `_function_list`)
# [[7]]
# withVisible(function_list[[k]](value))
# [[8]]
# function_list[[k]](value)
# [[9]]
# (function (x) sys.calls())(.)

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

a <- 6
b <- a
f <- function(x) deparse(substitute(x))
f(b)
# [1] "b"

но R не может знать, что b на самом деле пришел из a, Там нет способа пройти назад через такие задания, как это. substitute будет работать так, только если у вас все еще есть доступ к обещанию, которое было передано функции.

Таким образом, проблема к тому времени, когда ваша функция вызывается в цепочке, она была переназначена . вот почему вы больше не можете получить доступ к первоначальному "имени".

Другие вопросы по тегам