2015-08-13 3 views
3

Как R заключает в круглые скобки? Как и большинство других языков программирования, это встроенные операторы, и я обычно использую их, не задумываясь.Функция круглых скобок (круглые скобки) в R

Однако я столкнулся с этим примером. Скажем, у нас есть data.table в R, и я бы хотел применить функцию к ее столбцам. Тогда я мог бы написать:

dt <- data.table(my_data) 
important_cols <- c("col1", "col2", "col5") 
dt[, (important_cols) := lapply(.SD, my_func), .SDcols = important_cols] 

Очевидно, что я не могу пренебрегать скобками:

dt[, important_cols := lapply(.SD, my_func), .SDcols = important_cols] 

как что бы ввести новый объект под названием important_cols к моему data.table, вместо того, чтобы модифицировать свои существующие столбцы на месте.

Мой вопрос: почему делает() вокруг вектора «развернуть» его?

Этот вопрос, возможно, лучше сформулирован и назван. Но тогда я, вероятно, нашел бы ответ Гуглингом, если бы знал эту терминологию, когда я ее спрашивал, поэтому я здесь.

Пока мы на эту тему, если кто-то может указать на различия между [], {}, и т.д., и как они должны быть использованы, который был бы оценен тоже :)

+7

Открытые круглые скобки указывают на начало списка аргументов и маркер слева от открытого Paren должен быть именем функции. Если в левой части открытого парагона нет лексема, это неявный вызов 'eval'. Вы не должны использовать синтаксис data.table для изучения синтаксиса R. Это действительно пакет kewl, но синтаксис полностью отличается от '[.data.table' –

+0

. Вы найдете много информации о помощи для' ['using'? "[" '. Также есть (но не много) информация о '? '{" '. – Molx

ответ

2

специальной функцией R (по сравнению с, например, C++), состоит в том, что различные круглые скобки являются фактически функциями. Это означает, что (a) и a - это разные выражения. Второй - это только a, в то время как первая функция ( вызвана с аргументом a. Вот несколько выражений деревьев для вас для сравнения:

as.list(substitute(a)) 
#[[1]] 
#a 

as.list(substitute((a))) 
#[[1]] 
#`(` 
# 
#[[2]] 
#a 

as.list(substitute(sqrt(a))) 
#[[1]] 
#sqrt 
# 
#[[2]] 
#a 

Обратите внимание, насколько похожи последние деревья - в одном функция sqrt, в другом это "(". В большинстве мест в R функция "(" ничего не делает, она просто возвращает одно и то же выражение, но в конкретном случае data.table оно «переопределено» (в кавычках, потому что это не совсем так, как это делается, но в духе является) выполнять множество полезных операций.

А вот еще одна демонстрация, мы надеемся, цементировать точку:

`(` = function(x) x*x 
2 
#[1] 2 
(2) 
#[1] 4 
((2)) 
#[1] 16