рекурсивно конкатенация JavaScript аргументы функций

Dplyr может сделать это довольно хорошо с помощью следующего кода. Строка позволяет вам рассматривать каждую строку отдельно. И команда mutate суммирует любые столбцы, которые вы хотите. na.rm = TRUE обрабатывает проблему, когда у вас есть NA и вы хотите их игнорировать. Как упоминалось в комментарии, если у вас его нет, он даст вам NA, если он находится в любом из суммированных значений.

library(dplyr)
df %>% 
  rowwise() %>% 
  mutate(f_new = sum(f,f2, na.rm = TRUE))
5
задан 31 January 2009 в 23:46
поделиться

5 ответов

arguments как говорят, подобный Массиву объект. Как Вы уже видели, можно получить доступ к его элементам индексом, но у Вас нет всех методов Массива в Вашем распоряжении. Другими примерами подобных Массиву объектов являются наборы HTML, возвращенные getElementsByTagName () или getElementsByClassName (). jQuery, если Вы когда-либо использовали его, является также подобным Массиву объектом. После запросов некоторых Объектов DOM осмотрите получающийся объект jQuery с Firebug на вкладке DOM, и Вы будете видеть то, что я имею в виду.

Вот мое решение для проблемы Meebo:

function conc(){
    if (arguments.length === 0)
        return "";
    else
        return Array.prototype.slice.call(arguments).join(" ");
}

alert(conc("a", "b", "c"));

Array.prototype.slice.call(arguments) хороший прием должен преобразовать наш arguments в истинный объект Массива. В Firefox Array.slice.call(arguments) был бы достаточен, но это не будет работать в IE6 (по крайней мере), таким образом, бывшая версия будет тем, что обычно используется. Кроме того, этот прием не работает на набор, возвращенный методами API DOM в IE6 (по крайней мере); это бросит Ошибку. Между прочим, вместо call можно было использовать apply.

Немного объяснения о подобных Массиву объектах. В JavaScript можно использовать в значительной степени что-либо для именования членов объекта, и числа не являются исключением. Таким образом, можно создать объект, который похож на это, которое является совершенно допустимым JavaScript:

var Foo = {
    bar : function() {
        alert('I am bar');
    },

    0 : function() {
        alert('I am 1');
    },

    length : 1
}

Вышеупомянутый объект является подобным Массиву объектом по двум причинам:

  1. Это имеет участников, какие имена являются числами, таким образом, они похожи на Индексы массива
  2. Это имеет a length свойство, без которого Вы не можете преобразовать объект в истинный Массив с конструкцией: Array.prototype.slice.call(Foo);

Объект arguments Функционального объекта в значительной степени похож на объект Foo, только что он имеет свое особое назначение.

12
ответ дан 18 December 2019 в 06:04
поделиться

Mozilla на предмете:

Объект arguments не является массивом. Это подобно массиву, но не имеет никаких свойств массива кроме длины. Например, это не имеет поп-метода. Однако это может быть преобразовано в действительный массив:

var args = Array.prototype.slice.call(arguments);

Поэтому решение Вашей проблемы довольно просто:

var string = Array.prototype.slice.call(arguments).join("");

BTW: Это дальнейшие состояния:

Объект arguments является локальной переменной, доступной во всех функциях; аргументы как свойство Функции больше не могут использоваться.

Необходимо только использовать arguments вместо func.arguments

7
ответ дан 18 December 2019 в 06:04
поделиться

Это работает:

function concatenate(){
    return [].join.call(arguments, "");
}
alert(concatenate("one", "two", "three"));
6
ответ дан 18 December 2019 в 06:04
поделиться

Список аргументов не является подлинным массивом. Я думаю, что можно одолжить методы массива и использовать их на спорах с "вызовом" или "подать заявку".

1
ответ дан 18 December 2019 в 06:04
поделиться

Вы могли сделать это:

function concatenate() {
    if (arguments.length > 1) {
        return arguments[0] + concatenate.apply(this, Array.prototype.splice.call(arguments, 1));
    }
    return arguments[0];
}
1
ответ дан 18 December 2019 в 06:04
поделиться
Другие вопросы по тегам:

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