строка мудрая функция в dplyr r [дубликат]

Вы хотите передать ссылку на функцию как обратный вызов, а не результат выполнения функции:

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.

15
задан C_Z_ 6 October 2015 в 20:20
поделиться

4 ответа

Вместо 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)))
20
ответ дан akrun 16 August 2018 в 02:39
поделиться
  • 1
    хорошая идея на pmax. Любая идея, как я могу найти max из 3 столбцов, только ссылаясь на книжные знаки? ex: Sepal.Width через Petal.Width? – user2502836 6 October 2015 в 20:07
  • 2
    @ user2502836 Обновлено сообщение. Пожалуйста, проверьте, помогает ли это. – akrun 6 October 2015 в 20:13

С 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

h / t: https://stackoverflow.com/a/47773379/1036500

2
ответ дан Ben 16 August 2018 в 02:39
поделиться

Для выбора некоторых столбцов без ввода целых имен при использовании dplyr я предпочитаю параметр select из функции subset.

Вы можете получить желаемый результат следующим образом:

iris %>% subset(select = 2:4) %>% mutate(mak = do.call(pmax, (.))) %>%
  select(mak) %>% cbind(iris)
3
ответ дан inscaven 16 August 2018 в 02:39
поделиться
  • 1
    Я думаю, что можно просто сделать 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
0
ответ дан Scott Olesen 16 August 2018 в 02:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: