Пользовательские функции автозаполнения в R возможны?

#r #autocomplete #dplyr

#r #автозаполнение #dplyr

Вопрос:

Я хочу создать пользовательскую функцию в R, которая позволит пользователю вызывать функцию, а затем она создаст конвейер автозаполнения, готовый для редактирования, таким образом, они могут быстро настроить стандартный конвейер вместо копирования вставки из старого скрипта или повторного ввода. Как я могу настроить такого рода автозаполнение:

 #pseudo code what I type---
seq.Date(1,2,by = "days") %>%
  pblapply(function(x){
    read.fst(list.files(as.character(x), as.data.table = T) %>%
               group_by(x) %>%
               count()
  }) %>% rbindlist()

#how can I write a function so that when I call that function, it ouputs an autocomplete
#of the above so that I can go ahead and start just customizing the code? Something like this
my_autocomplete_function = function(x) {
  print(
    "
    seq.Date(as.Date(Sys.Date()),as.Date(Sys.Date() 1),by = 'days') %>%
      pbapply::pblapply(function(x){
        fst::read.fst(list.files(as.character(x), as.data.table = T)) %>%
          #begin filtering and grouping by below custom
          group_by()


      }) %>% rbindlist()  
")
}

#I can just print the function and copy paste the text from the output in my console to my script
my_autocomplete_function()
#but I rather it just autocomplete and appear in the script if possible?
  

Комментарии:

1. Под «автозаполнением» вы подразумеваете, что хотите, чтобы этот текст отображался в командной строке? На самом деле это не автозаполнение (именно там вы вводите d-a-t-a- , а R предоставляет вам возможные варианты).

2. Консоль или окно сценариев. Я не был уверен, какое правильное слово для этого есть. Например, в javascript в Atom вы можете ввести несколько букв, ввести нужную функцию, а затем вся функция будет выписана для вас со всеми параметрами, готовыми к заполнению. Что-то в этом роде, кроме не функции с параметрами, а всего текста, который я печатаю выше. Я знаю, что это неортодоксальный запрос, но потенциально полезный для моих приложений.

Ответ №1:

Ввод текста в командную строку, вероятно, будет функцией интерфейса, который вы используете для запуска R — это обычный R, Rstudio и т. Д.?

Одной из возможностей может быть использование clipr пакета и помещение кода в буфер обмена, а затем предложить пользователю нажать кнопку «вставить», чтобы получить его в командной строке. Например, эта функция, которая создает небольшую строку кода:

 > writecode = function(x){
    code = paste0("print(",x,")")
    clipr::write_clip(code)
    message("Code ready to paste")}
  

Используйте это так:

 > writecode("foo")
Code ready to paste
  

Затем, когда я нажимаю Ctrl-V для вставки, я вижу это:

 > print(foo)
  

Затем я могу отредактировать эту строку. Подойдет любая строка:

 > writecode("bar")
Code ready to paste
[ctrl-V]
> print(bar)
  

Это одна дополнительная клавиша, которую пользователь может нажать, но появление фрагмента кода в командной строке без запроса может быть довольно неожиданным для пользователя.

Комментарии:

1. Это хороший обходной путь! Я определенно могу работать с этим, по крайней мере, временно. Мне любопытно узнать, есть ли у кого-нибудь еще предложения, но если нет, я добавлю их через некоторое время. Спасибо.

Ответ №2:

Я провожу свой день, читая исходный код для автозаполнения утилит. Линейный буфер содержит только код для … одна строка, так что она не может полностью выполнить то, что вы ищете здесь, но она вполне настраиваема. Возможно, исходный код rstudio для автозаполнения содержит больше ответов. Вот пример написания и активации вашего собственного пользовательского автозаполнителя. Это не очень хорошо подходит для пакетов, так как любой новый pacakge может перезаписать настройки.

Ниже

 #load this function into custom.completer setting to activate
rc.options("custom.completer" = function(x) {

  #perhaps debug it, it will kill your rsession sometimes
  #browser()

  ###default completion###

  ##activating custom deactivates anything else
  #however you can run utils auto completer also like this
  #rstudio auto completation is not entirely the same as utils
  f = rc.getOption("custom.completer")
  rc.options("custom.completer" = NULL)
  #function running  base auto complete.
  #It will dump suggestion into mutable .CompletionEnv$comps
  utils:::.completeToken() #inspect this function to learn more about completion
  rc.options("custom.completer" = f)

  ###your custom part###

  ##pull this environment holding all input/output needed
  .CompletionEnv = utils:::.CompletionEnv

  #perhaps read the 'token'. Also 'linebuffer', 'start' amp; 'end' are also useful
  token = .CompletionEnv$token

  #generate a new completion or multiple...
  your_comps = paste0(token,c("$with_tomato_sauce","$with_apple_sauce"))

  #append your suggestions to the vanilla suggestions/completions
  .CompletionEnv$comps = c(your_comps,.CompletionEnv$comps)

  print(.CompletionEnv$comps)

  #no return used
  NULL
})
xxx<tab>
  

пример

NB! в настоящее время rstudio IDE будет возвращать любое предложение, которое не сгенерировано ими. Я хочу когда-нибудь поднять вопрос об этом.

Бонусная информация: A .DollarNames.mys3class-метод может быть очень полезен и работает как с rstudio, так и с утилитами из коробки, например

 #' @export
.DollarNames.mys3class = function(x, pattern = "") {
  #x is the .CompletionEnv
  c("apple","tomato")
}