Как построить CDF дискретной переменной в R? [Дубликат]

У меня есть ответ в виде беседы, чтобы лучше читать:


Зачем нам нужны виртуальные функции?

Из-за полиморфизма.

Что такое полиморфизм?

Тот факт, что базовый указатель также может указывать на объекты производного типа.

Как это определение Полиморфизма приводит к необходимости виртуальных функций?

Хорошо, через раннее связывание .

Что такое раннее связывание?

Раннее связывание (компиляция-время привязки) в C ++ означает что вызов функции фиксирован до того, как программа будет выполнена.

Итак ...?

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

Если это не то, что мы хотим, то почему разрешено?

Потому что нам нужен полиморфизм!

В чем польза от полиморфизма?

You может использовать указатель базового типа как параметр одной функции, а затем во время выполнения вашей программы вы можете получить доступ к каждому из интерфейсов производного типа (например, их функции-члены) без каких-либо проблем, используя разыменование этого единственного базового указателя.

Я до сих пор не знаю, какие виртуальные функции хороши для ...! И это был мой первый вопрос!

ну, это потому, что вы слишком быстро задали свой вопрос!

Зачем нам нужны виртуальные функции?

Предположим, что вы называемой функцией с базовым указателем, который имел адрес объекта из одного из его производных классов. Как мы говорили об этом выше, во время выполнения этот указатель разыменовывается, настолько хорошо, однако мы ожидаем, что будет выполнен метод (== функция-член) «из нашего производного класса»! Тем не менее, тот же самый метод (тот, который имеет один и тот же заголовок) уже определен в базовом классе, поэтому почему ваша программа не хочет выбирать другой метод? Другими словами, я имею в виду, как вы можете сказать, что этот сценарий отключен от того, что мы обычно видели раньше?

Краткий ответ: «Виртуальная функция-член в базе», и немного более длинный ответ заключается в том, что , «на этом этапе, если программа видит виртуальную функцию в базовом классе, она знает (понимает), что вы пытаетесь использовать полиморфизм», и поэтому переходит к производным классам (используя v-table , форма позднего связывания), чтобы найти, что другой метод с тем же заголовком, но с-неожиданно - другая реализация.

Почему другая реализация?

Ты сутулясь! Пойдите, прочитайте хорошую книгу !

ОК, подождите, подождите, подождите, почему бы вам не использовать базовые указатели, когда он мог просто использовать указатели производного типа? Вы, судья, все это стоит? Посмотрите на эти два фрагмента:

// 1:

Parent* p1 = &boy;
p1 -> task();
Parent* p2 = &girl;
p2 -> task();

// 2:

Boy* p1 = &boy;
p1 -> task();
Girl* p2 = &girl;
p2 -> task();

ОК, хотя я думаю, что 1 все еще лучше, чем 2, вы можете написать 1 следующим образом:

// 1:

Parent* p1 = &boy;
p1 -> task();
p1 = &girl;
p1 -> task();

, и, кроме того, вы должны знать, что это всего лишь надуманное использование всех вещи, которые я вам объяснил до сих пор. Вместо этого предположим, например, ситуацию, в которой у вас была функция в вашей программе, которая использовала методы из каждого из производных классов соответственно (getMonthBenefit ()):

double totalMonthBenefit = 0;    
std::vector mainShop = { &shop1, &shop2, &shop3, &shop4, &shop5, &shop6};
for(CentralShop* x : mainShop){
     totalMonthBenefit += x -> getMonthBenefit();
}

Теперь попробуйте повторно -write this, без каких-либо головных болей!

double totalMonthBenefit=0;
Shop1* branch1 = &shop1;
Shop2* branch2 = &shop2;
Shop3* branch3 = &shop3;
Shop4* branch4 = &shop4;
Shop5* branch5 = &shop5;
Shop6* branch6 = &shop6;
totalMonthBenefit += branch1 -> getMonthBenefit();
totalMonthBenefit += branch2 -> getMonthBenefit();
totalMonthBenefit += branch3 -> getMonthBenefit();
totalMonthBenefit += branch4 -> getMonthBenefit();
totalMonthBenefit += branch5 -> getMonthBenefit();
totalMonthBenefit += branch6 -> getMonthBenefit();

И на самом деле это может быть еще и надуманным примером!

5
задан nico 27 October 2012 в 09:38
поделиться

3 ответа

df$step <- 1

library(plyr)
df <- ddply(df,.(individual),transform,step=cumsum(step))

plot(step~events,data=df[df$individual==1,],type="s",xlim=c(0,max(df$events)),ylim=c(0,max(df$step)),xlab="time",ylab="step")
lines(step~events,data=df[df$individual==2,],type="s",col=2)
lines(step~events,data=df[df$individual==3,],type="s",col=3)

step plot [/g0]

4
ответ дан Roland 28 August 2018 в 00:17
поделиться

Используйте ggplot2:

library(ggplot2)

# Add step height information with sequence and rle
df$step <- sequence(rle(df$individual)$lengths)

# plot
df$individual <- factor(df$individual)
ggplot(df, aes(x=events, group=individual, colour=individual, y=step)) + 
  geom_step()

enter image description here [/g0]

4
ответ дан Andrie 28 August 2018 в 00:17
поделиться

В пакете статистики есть функция stepfun. Используя этот метод, вы можете использовать метод plot для этого класса объектов:

sdf <- split(df, individual)

plot(1, 1, type = "n", xlim = c(0, max(events)), ylim = c(0, max(table(individual))),
  ylab = "step", xlab = "time")

sfun <- lapply(sdf, function(x){
    sf <- stepfun(sort(x$events), seq_len(nrow(x) + 1) - 1)
    plot(sf, add = TRUE, col = unique(x$individual), do.points = FALSE)
})

enter image description here [/g0]

4
ответ дан BenBarnes 28 August 2018 в 00:17
поделиться
Другие вопросы по тегам:

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