#r
#r
Вопрос:
Я использую пакет 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’ — я не смог разобраться с синтаксисом доступа к другим элементам, таким как переменные ‘toldis’ или ‘names’ — я что-то не понимаю в структуре списка здесь
Комментарии:
1. Я не установил пакет. Но я предполагаю, что ваш объект происходит из класса S4. вы можете подтвердить с помощью
class(Vg.Zn)
. Если я прав, вы можете получить доступ к полям с помощьюVg.Zn@names
. Что касается прямого доступа, вы всегда можете создать свои собственные функции доступа.2. отчеты класса (Vg.Zn) … [1] «vario» … attr(,»пакет») … RGeostats
3. Я обнаружил, что могу получить список названий слотов, используя slotNames (Vg.Zn). Затем я могу получить значения слотов, используя синтаксис Vg.Zn@calcul например, чтобы получить значение для этого слота. Однако для вардиров слотов, похоже, мне нужно присвоить список, хранящийся здесь, другому объекту, прежде чем я смогу извлечь значения списка, как указано выше.
Ответ №1:
Я нашел решение следующим образом, осознав, что объект S4 может содержать другой объект S4, встроенный в виде элемента списка. Для прямого доступа, скажем, к слоту ‘sw’ слота ‘vardirs’ синтаксиса является:
Vg.Zn@vardirs[[1]]@sw