2015-05-05 5 views
3

Я хотел бы иметь функцию, которая может использовать оператор трубы, экспортируемый из dplyr. Я не использую magrittr.получить имя объекта LHS при прокладке трубопровода с помощью dplyr

df %>% my_function 

Как я могу получить имя df? Если я пытаюсь

my_function <- function(tbl){print(deparse(substitute(tbl)))} 

возвращает

[1] "." 

в то время как я хотел бы иметь [1] "ДФ"

Любое предложение?

Спасибо заранее,
Nicola

+3

Хотя я думаю, что это интересный вопрос, почему вы хотите это сделать? – eddi

+0

@eddi: my_func выполняет вывод некоторых манипуляций dplyr и выполняет некоторые дополнительные операции для форматирования данных для печати и экспорта. Я хотел бы экспортировать данные в объект в файл csv с тем же именем, что и объект. –

+0

Ну, нет никакого способа, чтобы 'df%>% stuff%>% my_func' мог это сделать, поскольку по точке он попадает в 'my_func', он вполне может быть совсем другим объектом, и информация о самом левом объекте будет потеряна, поэтому мое предложение состоит в том, чтобы просто сделать' my_func (df) ' – eddi

ответ

-1

Я не считаю, что это возможно без добавления дополнительного аргумента к вашим my_function. При цепных функциях с dplyr он автоматически преобразует df в объект tbl_df, следовательно, новое имя "." в пределах dplyr, чтобы упростить прокладку трубопровода.

Ниже очень Hacky способом с dplyr который просто добавляет капельной аргумент, чтобы вернуть имя оригинального data.frame

my_function <- function(tbl, orig.df){print(deparse(substitute(orig.df)))} 
df %>% my_function(df) 
[1] "df" 

Примечание Вы не можете просто передать df с исходной функцией, так как tbl_df объект автоматически передается ко всем последующим функциям.

+0

Я бы сказал, что это хуже, чем выполнение' my_fn = function (tbl, origin.df) print (origin.df); df%>% my_fn ("df") ', что явно бессмысленно. – eddi

+0

@eddi Я полностью согласен, я только хотел предоставить то, о чем попросил ОП, не используя дополнительный пакет. Все дело, как вы говорите, бессмысленно. – cdeterman

0

Вот Hacky способ сделать это, что я уверен, что перерывы в тонне краевых случаях:

library(data.table) # for the address function 
        # or parse .Internal(inspect if you feel masochistic 

fn = function(tbl) { 
    objs = ls(parent.env(environment())) 
    objs[sapply(objs, 
      function(x) address(get(x, env = parent.env(environment()))) == address(tbl))] 
} 

df = data.frame(a = 1:10) 
df %>% fn 
#[1] "df" 

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

  • Нет связанных вопросов^_^