Как использовать «применить» с функцией, которая возвращает неправильные размеры (R) - PullRequest
0 голосов
/ 26 августа 2018

У меня есть функция общего назначения, которую я использую с различными сценариями, которая возвращает вектор измерения больше единицы.Но я хочу использовать эту функцию с 'apply' и использовать только один из результатов в возвращенном векторе.Есть ли способ сделать это без переписывания вызываемой функции ??

Вот игрушечный пример.Я определяю функцию 'dummy', которая принимает вектор и возвращает минимальное и максимальное значение в 2-векторе.Я хочу, чтобы он работал по матрице столбец за столбцом, используя «apply», но меня интересует только минимальный ответ («b» в примере ниже).Есть ли способ сделать это?

dummy <- function(x)
{
  a <- max(x)
  b <- min(x)
  return(c(a,b))
}
z <- matrix(c(2,3,4,5,6,7,8,9,10), nrow = 3)
apply(z, 2, dummy)

Это дает ответ 5,5, что является глупостью.Есть ли способ передать пустышку как анонимную функцию, чтобы я использовал только второй элемент возвращаемого вектора для каждого столбца z?

1 Ответ

0 голосов
/ 26 августа 2018

Возможно, вы можете получить вдохновение в следующем примере.
Анонимная функция использует жестко запрограммированную функцию dummy и другую функцию, аргумент fun установлен равный log.

dummy <- function(x){
  a <- max(x)
  b <- min(x)
  c(a, b)
}

z <- matrix(c(2,3,4,5,6,7,8,9,10), nrow = 3)
apply(z, 2, dummy)

apply(z, 2, function(x, fun){
    y <- dummy(x)
    y <- fun(y[2])
    y
}, fun = log)
#[1] 0.6931472 1.6094379 2.0794415

Другая возможность состоит в том, чтобы itworks требовалось два аргумента: вектор x и функция, выбранная в каждом конкретном случае.

itworks <- function(x, fun){
  qq <- quantile(x)
  fun(qq[2])
}

apply(z, 2, itworks, fun = sin)
#[1]  0.5984721 -0.7055403  0.7984871

Дело в том, что аргументы - это функциядубль может быть любым, включая другие функции.apply имеет 3 обязательных аргумента, X, MARGIN и FUN, плюс аргумент dots.В аргументе dots вы можете передать все, что захотите, если FUN примет это.

...