Цикличное выполнение через столбец в R

В Вашем первом примере международный параметр value увеличен, но уничтожается, когда метод заканчивается, Вы не можете получить значение вне метода, если Вы не используете касательно или ключевые слова.

, Например:

private int DoSomething(ref int value) {
   return value++;
}

// ...
int myValue = 5;
DoSomething(ref myValue);
// Now myValue is 6.

Касательно и режимы передачи параметров используются, чтобы позволить методу изменяться, переменные передали в вызывающей стороной метода. Основное различие между касательно и может быть тонким, но это важно.

Каждый режим передачи параметров разработан к комплекту различные потребности программирования.

вызывающая сторона метода, который берет параметр, не обязана присваивать переменной, переданной как параметр до вызова; однако, метод требуется для присвоения к параметр перед возвратом.

Один способ думать о параметрах состоит в том, что они похожи на дополнительные возвращаемые значения метода. Они удобны, когда метод должен возвратить больше чем одно значение.

касательно [1 116] параметры заставляет аргументы быть переданными ссылкой. Эффект состоит в том, что любые изменения в параметре в методе будут отражены в той переменной, когда управление будет пасовать назад к вызывающему методу.

не путают понятие передачи ссылкой с понятием ссылочных типов .

Эти два понятия не связаны; параметр метода может быть изменен касательно независимо от того, является ли это типом значения или ссылочным типом, нет никакой упаковки типа значения, когда это передается ссылкой.

7
задан Paul 17 February 2016 в 12:46
поделиться

3 ответа

без каких-либо примеров , трудно понять, как ответить. Однако основной случай того, что вы описываете, таков:

#Just a very simple data frame
dat <- data.frame(x = c(1, 2, 3))
#Compute the squared value of each value in x
dat$y <- dat$x^2
#See the resultant data.frame, now with column y
dat

Когда вы говорите R возвести в квадрат вектор (или векторную структуру, например, dat $ x), он знает, как возвести в квадрат каждое значение отдельно. Вам не нужно явно перебирать эти значения большую часть времени - хотя, как отмечает Дирк, вам следует беспокоиться об оптимизации ваших циклов только в том случае, если они вызывают у вас проблемы. Тем не менее, я предпочитаю читать и писать

dat$y <- dat$x^2

, а не:

for(i in 1:length(dat$x)){
  dat$y[i] <- dat$x[i]^2
}

... там, где это возможно.

12
ответ дан 6 December 2019 в 15:23
поделиться

если parse.smiles () - это функция, которую вы хотите применить ко всем записям вектора "vec", то вы можете использовать:

lapply(1:length(vec),parse.smiles(vec[i]))
1
ответ дан 6 December 2019 в 15:23
поделиться

Единственная причина, по которой создание циклов не рекомендуется, состоит в том, что он медленный. R разработан для одновременной работы с векторами и имеет множество функций для этого. Все семейство apply, а также такие функции, как Vectorize, помогают. Итак, идиома состоит в том, что если вы используете циклы for, вы не думаете о R, но иногда циклы for действительно подходят.

Чтобы сделать это в стиле R, векторизуйте вашу функцию, если она еще не векторизована (см. Функцию векторизации), затем вызовите эту функцию со всем столбцом в качестве аргумента и назначьте его новому столбцу.

f<-Vectorize(function(x,...),'x')
data$newcolumn<-f(data[,1])

Семейство apply (apply, sapply, lapply, mapply, tapply) также является альтернативой. Большинство собственных функций R уже векторизованы, но будьте осторожны при передаче дополнительных аргументов, которые предполагается интерпретировать как векторы.

1
ответ дан 6 December 2019 в 15:23
поделиться
Другие вопросы по тегам:

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