Другим вариантом, если производительность является проблемой, является использование расширения data.table
для расширения reshape2
расплава & amp; dcast functions
( Ссылка: эффективная перестройка с использованием data.tables )
library(data.table)
setDT(dat1)
dcast(dat1, name ~ numbers, value.var = "value")
# name 1 2 3 4
# 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078
# 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814
И, как и в data.table v1.9.6, мы можем использовать несколько столбцов
## add an extra column
dat1[, value2 := value * 2]
## cast multiple value columns
dcast(dat1, name ~ numbers, value.var = c("value", "value2"))
# name value_1 value_2 value_3 value_4 value2_1 value2_2 value2_3 value2_4
# 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078 0.3672866 -1.6712572 3.190562 0.6590155
# 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814 -1.6409368 0.9748581 1.476649 1.1515627
Это невозможно, но это:
var operators =
{
'<': function(a, b) { return a < b; },
'>': function(a, b) { return a > b; },
/* ... etc. ... */
};
/* ... */
var op1 = '<';
var op2 = '>';
if (operators[op1](a, b) && operators[op2](c, d))
{
/* ... */
}
Не напрямую, но вы можете создать такую функцию:
if (operate(op1, x, xval) && operate(op2, x, xval)) {
console.log('yay');
}
function operate(operator, x, y) {
switch(operator) {
case '<':
return x < y;
}
}
Это не приятно, но возможно:
var op1 = "<";
var op2 = ">";
if (eval("x"+op1+xval+" && y"+op2+yval)) {
console.log('yay');
}
Также см. мой jsfiddle . Я бы предпочел ответить на bobbymcr.
Вы могли бы сделать что-то вроде этого.
var OpMap = {
'>': function (a,b) return a>b;},
'<': function (a,b) return a<b;}
}
if (OpMap[op1](x,xval) && OpMap[op2](y,yval)) {
console.log('yay');
}