rePost: Итеративное создание имен в R для хранения графиков (2009) - PullRequest
1 голос
/ 20 февраля 2011

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

В предыдущем посте был указан следующий код:

# Создатьсписок для хранения объектов сюжета.

pltList <- list()

for( i in 2:15 ){

# Получить данные, выполнить анализ и т. Д.

# Создать имя графика.
pltName <- paste( 'a', i, sep = '' )

# Сохранить график в списке, используя имя в качестве индекса.
pltList[[ pltName ]] <- plot()

}

Ниже приведена моя реализация кода:

a <- list.files("F:.../4hrs", pattern='.csv')
pltList <- list()
i=1

for (x in a) {
    myfiles <- read.csv(a, header=TRUE, as.is=TRUE, nrows=2500)

    h <- hist(data, plot=F)
    # perform analysis, ect.

    pltName <- paste('a', formatC(i, width=2, flag='0'), sep='')
    pltList[[ pltName ]] <- plot(h)
    i <- i+1

  }

pltName создает список имен, но pltList имеет нулевую длину.

Я не уверен, почему pltList не присваивается графики.
В конечном итоге я хочу создать pltList с несколькими графиками, содержащимися в них.Затем построите эти графики в стиле par(mfrow=c(2,1)) и экспортируйте в формате .pdf.

. Следует отметить, что вышеприведенное работает для

pltList[[ pltName ]] <- xyplot(h)

, но тогда я не могу построить несколько графиков встиль par(mfrow=c(2,1)).

Любые предложения приветствуются.

Ответы [ 2 ]

1 голос
/ 20 февраля 2011

В исходном вопросе, на который вы ссылались, и в моем ответе на него plot() использовался в качестве абстрактного заполнителя для функции построения графиков, которая возвращала объект, а не буквальный вызов функции R plot. Большинство функций, которые возвращают графические объекты, основаны на пакете 'grid', таком как xyplot из пакета lattice или qplot из ggplot2.

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

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

Чтобы использовать этот подход, вы должны обменять использование функции hist на что-то, что возвращает объект. Используя ggplot2, вы можете сделать что-то вроде следующего в вашем цикле:

# Don't call your data variable 'data' or ggplot will confuse it with the
# `data` function and suffer an error.
h <- qplot(x = plot_data)

pltName <- paste('a', formatC(i, width=2, flag='0'), sep='')
pltList[[ pltName ]] <- h

Я отредактировал свой ответ на предыдущий вопрос, чтобы было ясно, что использование plot() в моем примере не является фактическим вызовом функции R с тем же именем.

0 голосов
/ 20 февраля 2011

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

a <- list.files("F:.../4hrs", pattern='.csv')

Я не знаком с list.files, это правильно назначает a? .csv кажется странным паттерном.

pltList <- list()
i=1

for (x in a) {


 myfiles <- read.csv(a, header=TRUE, as.is=TRUE, nrows=2500)

Здесь я думаю a - это вектор, содержащий filenanes, верно? Вы зацикливаете x для каждого значения a, однако я не вижу возврата x в коде. Также вы читаете вектор имен файлов здесь. Должно ли это быть read.csv(x,..., или, что еще лучше, цикл for (i in 1:length(a)) и индекс a[i].

    h <- hist(data, plot=F)

Я нигде не вижу объект data. h правильно назначен?

# perform analysis, ect.

    pltName <- paste('a', formatC(i, width=2, flag='0'), sep='')
    pltList[[ pltName ]] <- plot(h)
    i <- i+1
  }

Что мне нравится делать, так это просто запускать такой цикл вручную и смотреть, что происходит. Я думаю, что есть проблема в назначении myfiles или h

...