R: В определяемом пользователем Fn, могу ли я включить отложенные команды, возможно, с пользовательским вводом? - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь создать пользовательскую функцию (давайте назовем ее udf), которая позволит мне объединить несколько строк кода, чтобы он был сжатым и легче для чтения.

Давайте просто возьмемпростой пример. Когда я использую функцию tiff (или почти любую функцию вывода: png, jpeg, ...), мне приходится заканчивать ее dev.off(), и мне было интересно, смогу ли я создать функцию, котораяделает что-то вроде:

udf <- function(title)
{tiff(filename=title)
   *execute the next line of code in my R script*
   dev.off()
}

Так что я могу превратить 3 строки кода в 2, то есть:

tiff("plot.tiff")             # >>>>>>>>>>>    udf("plot.tiff")
plot(x)                       # >>>>>>>>>>>    plot(x)
dev.off()

Из того, что я нашел в Интернете, одно решение было положитьзадержка "dev.off ()" на 1 секунду, но это не показалось эффективным, плюс я считаю, что функция delay в любом случае больше не работает. Поэтому я считаю, что есть три варианта, которые я пытаюсь изучить. Либо тот, что приведен выше, который будет ожидать получения следующей строки кода и затем выполнять ее до dev.off(), либо:

Может быть, функция с аргументом, который может быть выполнен, т.е.:

udf <- function(title, arg)   # >>>>>>>>>>>    udf("plot.tiff", plot(x))           
{tiff(filename=title)         # >>>>>>>>>>>    That would make it one line!
   *execute(arg)*          
   dev.off()
}

Или, возможно, способ выполнить приглашение ввода пользователя, например:

udf <- function(title)
{tiff(filename=title)
   n <- prompt="Enter a command: "
   *execute(n)*
   dev.off()
}

Возможно, есть даже другой вариант, который я не могу придумать, но в Интернете, похоже, ничего не происходит,возможно, есть ключевое слово, которое я не использую в своем поиске, но любая помощь будет признательна. Спасибо!

Best, @ UpAndComing

1 Ответ

0 голосов
/ 31 октября 2019

Вы не можете «захватить» последующие вызовы функций, но вы можете передать блок кода на вызов функции. Например, с чем-то простым

udf <- function(title, code) {
   cat("start - ", title, "\n")
   code
   cat("end\n")
}

udf("hello", cat("ok\n"))
# start -  hello 
# ok
# end

, которое в вашем примере будет выглядеть примерно так:

udf("plot.tiff", plot(x) )

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

udf("plot.tiff", {
  plot(x)
  plot(y)
} )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...