Извлечение элементов из объекта класса R - PullRequest
0 голосов
/ 17 марта 2019

Я использую пакет RGeostats для вычисления вариограмм и хотел бы извлечь элементы из объекта класса RGeotats. Пример следующим образом:

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Load demo pollution data
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fn <- 'http://rgeostats.free.fr/doc/Files/Pollution.dat'
dt <- read.table(fn, header = F, na.strings = 'NA')
names(dt) <- c('ID','X','Y','Pb','Zn')

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Load RGeostats package
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Not on CRAN download zip file from 
# http://rgeostats.free.fr/download.php
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
require(RGeostats)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Load data into a Rgeostats database file
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
db <- db.create(dt, flag.grid = F, ndim = 2, autoname = F)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Define fields to be used as coordinates and variable
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
db <- db.locate(db,'X','x',1)
db <- db.locate(db,'Y','x',2)
db <- db.locate(db,'Zn','z',1)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Plot a data map using RGeostats 
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
plot(db, pch = 21, bg = 'red', col = 'black',title = 'Zn')

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Compute omnidirectional semivariogram for Zn
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Vg.Zn <- vario.calc(db, lag = 1, nlag = 10, calcul = 'vg')
plot(Zn.Vr, npairw = TRUE, npairpt = 1, title = 'Zn Omni')

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

 str(Vg.Zn)
Formal class 'vario' [package "RGeostats"] with 10 slots
  ..@ calcul   : chr "vg"
  ..@ by.sample: logi FALSE
  ..@ ndim     : int 2
  ..@ nvar     : int 1
  ..@ scale    : num 1
  ..@ means    : num(0) 
  ..@ dates    : num [1:2] -1e+30 1e+30
  ..@ vars     : num 12.9
  ..@ names    : chr "Zn"
  ..@ vardirs  :List of 1
  .. ..$ :Formal class 'vardir' [package "RGeostats"] with 17 slots
  .. .. .. ..@ npas        : num 10
  .. .. .. ..@ npatot      : int 10
  .. .. .. ..@ opt.code    : num 0
  .. .. .. ..@ idate       : int 1
  .. .. .. ..@ pas         : num 1
  .. .. .. ..@ toldis      : num 0.5
  .. .. .. ..@ tolang      : num 90
  .. .. .. ..@ bench       : num 0
  .. .. .. ..@ cylrad      : num 0
  .. .. .. ..@ tolcode     : num 0
  .. .. .. ..@ flag.regular: num 1
  .. .. .. ..@ breaks      : num 0
  .. .. .. ..@ codir       : num [1:2] 1 0
  .. .. .. ..@ size        : int 10
  .. .. .. ..@ sw          : num [1:10] 3 127 187 209 234 233 202 194 218 198
  .. .. .. ..@ hh          : num [1:10] 0.389 1.079 2.039 3.004 4.011 ...
  .. .. .. ..@ gg          : num [1:10] 0.462 9.213 4.667 7.32 5.729 ...

Я хотел бы извлечь объекты '@' sw ',' hh 'и' gg 'в фрейм данных. Этого я могу добиться, выполнив следующее:

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Extract variogram information from this class
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
v <- slot(Vg.Zn,'vardirs')
p <- data.frame(unlist(v[[1]][1][1]))
h <- data.frame(unlist(v[[1]][1][2]))
g <- data.frame(unlist(v[[1]][1][2]))

Vg.Zn2 <- cbind(p,h)
Vg.Zn2 <- cbind(Vg.Zn2,g)

Здесь я использую функцию 'slot', чтобы извлечь список из объекта класса, а затем выделить из подсписков нужные. Однако мне было бы интересно узнать, как получить доступ к этим подспискам (указать на них) более непосредственно для такого списка классов, вместо того, чтобы извлекать список, а затем настраивать его.

Кроме того, хотя синтаксис v [[1]] [1] давал мне доступ к подспискам 'sw', 'hh' и 'gg' - я не смог разобраться в синтаксисе доступа к другим элементам, таким как saidis или переменные 'names' - я не понимаю что-то о структуре списка здесь

1 Ответ

0 голосов
/ 19 марта 2019

Я нашел решение следующим образом после того, как понял, что объект S4 может содержать другой объект S4, встроенный как элемент списка. Для прямого доступа, скажем, слот 'sw' слота 'vardirs' синтаксиса:

Vg.Zn@vardirs[[1]]@sw
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...