Я читал этот SO-пост здесь, и решение было получено в виде этого блока кода R
:
f <- function(x, T) {
10 * sin(0.3 * x) * sin(1.3 * x^2) + 0.001 * x^3 + 0.2 * x + 80
}
g <- function(x, T, f. = f) { ## 1. note f.
exp(-f.(x)/T)
}
test<- function(g. = g, T = 1) { ## 2. note g.
g.(1,T)
}
test()
## [1] 8.560335e-37
Я просто хотел бы немного объяснить синтаксис в определениях функций g
и test
, где автор отмечает f.
и g.
Я видел такие вещи, как .f
и .g
, как при использовании map
или что-то в этом роде, но я не видел .
идут после. Я пробовал гуглить, но моя неспособность определить, что это было на самом деле, привело к плохим результатам. Я полагаю, что это как-то связано с рекурсией? Я не знаю.
@Kat У вас есть пример, в котором база R использует суффиксные точки специально для аргументов функции? Как правило, нет, и я не могу вспомнить ни одного примера. Большинство используют либо FUN
, либо обычные названия функций (например, f
). В любом случае, ваш комментарий потенциально может ввести в заблуждение, поскольку подразумевает, что параметры, привязанные к функциям, не являются переменными, но, конечно, они являются обычными переменными находятся. И «purrr» также не использует префикс-точку для обозначения функций — он просто использует точки для аргументов все в (ошибочной ИМХО) попытке отличить их от именованных аргументов, пересылаемых через ...
.
@Kat Мне действительно стало любопытно, поэтому я посмотрел аргументы функции все в базе R (используя скрипт). Есть экземпляры нет параметров функций, относящихся к функциям, оканчивающимся на .
. Некоторые имена параметров заканчиваются на .
(например, параметр call.
на stop
), но ни одно из них не связано с функциями.
Точка в конце не влияет на синтаксис, она такая же, как и любой другой допустимый символ в идентификаторе. Точка в начале имеет очень небольшой эффект, но это означает, что ls()
не будет отображать переменную по умолчанию.
В опубликованных вами примерах автор, вероятно, использовал f.
, чтобы напомнить читателю, что значением по умолчанию было f
, а g.
напоминает читателю о g
.
Частичное сопоставление аргументов означает, что пользователь может написать test(g = somefn)
, а R будет рассматривать somefn
как значение аргумента g.
.
В упомянутом вопросе, где вы видели этот код, исходная функция имела заголовок
g <- function(x, T, f=f) {
Это не сработает, потому что значение по умолчанию имеет то же имя, что и аргумент, а значения по умолчанию оцениваются во фрейме функции. Итак, он говорит: «Если аргумент f
не указан, установите его в качестве аргумента f
». Это бессмысленно. В опубликованной вами исправленной версии говорится: «Если аргумент f.
не указан, установите его в глобальную переменную f
».
Я считаю, что вы видите разницу между тем, что называется функцией, и «функционалом». Точка должна указать, что параметр не является объектом (как в переменной), а является другой функцией. Использование .f в чем-то вроде
map
кодируется как входной параметр. В то время как в базе R функция в качестве параметра вызывается с использованиемf.
(или любого другого имени функции).