Вы хотите передать ссылку на функцию как обратный вызов, а не результат выполнения функции:
showDiv()
возвращает некоторое значение; если не используется инструкция return
, возвращается undefined
.
showDiv
является ссылкой на функцию, которая должна быть выполнена.
Это должно работать:
$(document).ready(function(){
$('a.test').bind("click", showDiv);
});
В качестве альтернативы вы можете использовать анонимную функцию для выполнения более продвинутой функции:
...bind('click', function(){
foo.showDiv(a,b,c);
...more code...
});
В некоторых случаях вы можете хотеть использовать возвращаемое значение с помощью функции в качестве обратного вызова:
function function foo(which)
{
function bar()
{
console.log('so very true');
}
function baz()
{
console.log('no way!');
}
return which ? bar : baz;
}
...click( foo( fizz ) );
В этом примере foo
оценивается с помощью fizz
и возвращает функцию, которая будет назначена в качестве обратного вызова для события click.
Вместо rowwise()
это можно сделать с помощью pmax
iris %>%
mutate(mak=pmax(Sepal.Width,Petal.Length, Petal.Width))
Возможно, мы сможем использовать interp
из library(lazyeval)
, если хотим ссылаться на имена столбцов, хранящиеся в vector
.
library(lazyeval)
nm1 <- names(iris)[2:4]
iris %>%
mutate_(mak= interp(~pmax(v1), v1= as.name(nm1)))
С rlang
и квазиковацией у нас есть другая опция dplyr. Во-первых, получите имена строк, которые мы хотим вычислить для параллельного max для:
iris_cols <- iris %>% select(Sepal.Length:Petal.Width) %>% names()
. Затем мы можем использовать !!!
и rlang::syms
для вычисления параллельного max для каждой строки этих столбцов:
iris %>%
mutate(mak=pmax(!!!rlang::syms(iris_cols)))
rlang::syms
принимает строковый ввод (имена столбцов) и превращает его в символ !!!
unquotes и связывает его аргумент, здесь столбец имена Что дает:
Sepal.Length Sepal.Width Petal.Length Petal.Width Species mak
1 5.1 3.5 1.4 0.2 setosa 5.1
2 4.9 3.0 1.4 0.2 setosa 4.9
3 4.7 3.2 1.3 0.2 setosa 4.7
4 4.6 3.1 1.5 0.2 setosa 4.6
5 5.0 3.6 1.4 0.2 setosa 5.0
Для выбора некоторых столбцов без ввода целых имен при использовании dplyr
я предпочитаю параметр select
из функции subset
.
Вы можете получить желаемый результат следующим образом:
iris %>% subset(select = 2:4) %>% mutate(mak = do.call(pmax, (.))) %>%
select(mak) %>% cbind(iris)
select( 2:4 )
вместо subset( select = 2:4 )
.
– Artem Sokolov
12 October 2016 в 19:13
Кажется, что ответ @ akrun касается только случаев, когда вы можете вводить имена всех переменных, независимо от того, использует ли это mutate
непосредственно с mutate(pmax_value=pmax(var1, var2))
или при использовании ленивой оценки с mutate_
и interp
через mutate_(interp(~pmax(v1, v2), v1=as.name(var1), v2=as.name(var2))
.
Я вижу два способа сделать это, если вы хотите использовать синтаксис двоеточия Sepal.Length:Petal.Width
или если у вас есть вектор с именами столбцов.
Первый - более элегантный. Вы упорядочиваете данные и принимаете максимум среди значений при сгруппировании:
data(iris)
library(dplyr)
library(tidyr)
iris_id = iris %>% mutate(id=1:nrow(.))
iris_id %>%
gather('attribute', 'value', Sepal.Length:Petal.Width) %>%
group_by(id) %>%
summarize(max_attribute=max(value)) %>%
right_join(iris_id, by='id') %>%
head(3)
## # A tibble: 3 × 7
## id max_attribute Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## <int> <dbl> <dbl> <dbl> <dbl> <dbl> <fctr>
## 1 1 5.1 5.1 3.5 1.4 0.2 setosa
## 2 2 4.9 4.9 3.0 1.4 0.2 setosa
## 3 3 4.7 4.7 3.2 1.3 0.2 setosa
Чем сложнее использовать интерполированную формулу. Это хорошо, если у вас есть вектор символов с именами переменных, которые должны быть превышены или если вы слишком высоки / широки для того, чтобы его можно было убрать.
# Make a character vector of the names of the columns we want to take the
# maximum over
target_columns = iris %>% select(-Species) %>% names
## [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
# Make a vector of dummy variables that will take the place of the real
# column names inside the interpolated formula
dummy_vars = sapply(1:length(target_columns), function(i) sprintf('x%i', i))
## [1] "x1" "x2" "x3" "x4"
# Paste those variables together to make the argument of the pmax in the
# interpolated formula
dummy_vars_string = paste0(dummy_vars, collapse=',')
## [1] "x1,x2,x3,x4"
# Make a named list that maps the dummy variable names (e.g., x1) to the
# real variable names (e.g., Sepal.Length)
dummy_vars_list = lapply(target_columns, as.name) %>% setNames(dummy_vars)
## $x1
## Sepal.Length
##
## $x2
## Sepal.Width
##
## $x3
## Petal.Length
##
## $x4
## Petal.Width
# Make a pmax formula using the dummy variables
max_formula = as.formula(paste0(c('~pmax(', dummy_vars_string, ')'), collapse=''))
## ~pmax(x1, x2, x3, x4)
# Interpolate the formula using the named variables
library(lazyeval)
iris %>%
mutate_(max_attribute=interp(max_formula, .values=dummy_vars_list)) %>%
head(3)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species max_attribute
## 1 5.1 3.5 1.4 0.2 setosa 5.1
## 2 4.9 3.0 1.4 0.2 setosa 4.9
## 3 4.7 3.2 1.3 0.2 setosa 4.7