Концепция лямбда-функции C ++ основана на исчислении лямбда и функциональном программировании. Лямбда - это неназванная функция, которая полезна (в реальном программировании, а не в теории) для коротких фрагментов кода, которые невозможно повторно использовать и не стоит именовать.
В C ++ функция лямбда определяется следующим образом
[]() { } // barebone lambda
или во всей его славе
[]() mutable -> T { } // T is the return type, still lacking throw()
[]
- это список захвата, ()
список аргументов и {}
тело функции.
Список захвата определяет, что из-за лямбда должно быть доступно внутри тела функции и как. Это может быть либо:
Вы можете смешать любое из вышеперечисленного в списке с разделителями-запятыми [x, &y]
.
Список аргументов тот же, что и в любой другой функции C ++.
Код, который будет выполняться, когда на самом деле вызывается лямбда.
Если лямбда имеет только один оператор return, возвращаемый тип может быть опущен и имеет неявный тип decltype(return_statement)
.
Если лямбда отмечена как изменяемая (например, []() mutable { }
), она разрешено изменять значения, которые были записаны по значению.
Библиотека, определенная стандартом ISO, в значительной степени зависит от лямбда и повышает удобство использования нескольких баров, так как теперь пользователи
В C ++ 14 lambdas были расширены различными предложениями.
Элемент списка захвата теперь можно инициализировать с помощью =
. Это позволяет переименовывать переменные и захватывать, перемещаясь. Пример, взятый из стандарта:
int x = 4;
auto y = [&r = x, x = x+1]()->int {
r += 2;
return x+2;
}(); // Updates ::x to 6, and initializes y to 7.
и один из Википедии, показывающий, как захватить с помощью std::move
:
auto ptr = std::make_unique<int>(10); // See below for std::make_unique
auto lambda = [ptr = std::move(ptr)] {return *ptr;};
Теперь Lambdas может быть общим (auto
был бы эквивалентен T
здесь, если T
был аргументом шаблона типа где-то в окружающей области):
auto lambda = [](auto x, auto y) {return x + y;};
C ++ 14 позволяет выводить возвращаемые типы для каждой функции и не ограничивает ее функциями return expression;
. Это также распространяется на лямбда.
Я знаю, что это старо, но у меня был тот же вопрос. Я наконец-то понял. Вы включаете выражение в фигурные скобки и просто указываете события / реактивные объекты. Моя (необоснованная) догадка заключается в том, что блестящий просто выполняет тот же реактивный анализ указателя на этот блок выражений, что и стандартный блок reactive
.
observeEvent({
input$spec_button
mainplot.click$click
}, { ... } )
Вот решение, с которым я столкнулся: в основном создайте пустой держатель данных reactiveValues
, а затем измените его значения на основе двух отдельных экземпляров observeEvent
.
data <- reactiveValues()
observeEvent(input$spec_button, {
data$data <- get.focus.spec(input=input, premise=premise,
itemname=input$dropdown.itemname, spec.info=spec.info)
})
observeEvent(mainplot.click$click, {
data$data <- get.focus.spec(input=input, premise=premise, mainplot=mainplot(),
mainplot.click_focus=mainplot.click_focus(),
spec.info=spec.info)
})
list(mainplot.click$click, input$spec_button)
также будет работать для OP.
– John
22 September 2016 в 02:51
Также:
observeEvent(c(
input$spec_button,
mainplot.click$click
), { ... } )
{
- нет. Я не могу объяснить, почему это так.
– John Paul
10 February 2017 в 17:23
Я решил эту проблему с созданием реактивного объекта и использовать его в выражении изменения события. Как показано ниже:
xxchange <- reactive({
paste(input$filter , input$term)
})
output$mypotput <- eventReactive( xxchange(), {
...
...
...
} )
observeEvent
по умолчанию используетignoreNULL = TRUE
, что означает, что еслиmainplot.click$click
(возвращаемое значение)NULL
, обработчик будет никогда не вызываться, даже еслиinput$spec_button
изменен. Я бы рекомендовал что-то вроде ответа @ JustAnother, чтобы не попасть в эту ловушку. – greg L 19 February 2018 в 02:52{}
) ТРЕБУЕТСЯ, чтобы каждое событие было на собственной новой строке, иначе оно терпит неудачу с ошибкой в анализе ... & quot; как только парсер встретит второе событие. например, все в одной строке:observeEvent({input$spec_button mainplot.click$click}, {...})
терпит неудачу. @ Ответ JustAnother с использованием синтаксиса S3 Generic (c()
) работает независимо от новых строк. – Brian D 14 August 2018 в 19:23