#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")
}