Заполнение или чтение многомерного полинома с помощью пакета multipol - PullRequest
0 голосов
/ 20 ноября 2018

Этот код не работает:

library(multipol)
xyz <- function(px,py,pz,coef){
  A <- array(0, c(px+1,py+1,pz+1))
  P <- as.multipol(A)
  P[px,py,pz] <- coef
  P
}

> xyz(1,0,0,1)
 Error in eval(expr, p) : objet 'px' introuvable 

Показать трассировку:

7.
eval(expr, p) 
6.
eval(expr, p) 
5.
eval.parent(ii, 3) 
4.
.handleTheOffset(mc, dim, offset, dn) 
3.
`[<-.multipol`(`*tmp*`, px, py, pz, value = 1) 
2.
`[<-`(`*tmp*`, px, py, pz, value = 1) 
1.
xyz(1, 0, 0, 1) 

Я нашел этот обходной путь:

xyz <- function(px,py,pz,coef){
  A <- array(0, c(px+1,py+1,pz+1))
  P <- as.multipol(A)
  f <- function(){
    P[px,py,pz] <- coef
    P
  }
  f()
}

> xyz(1,0,0,1)
, , z^0

    y^0
x^0   0
x^1   1 

Nice? Хм, подожди. Теперь у меня есть эта функция в пакете:

representation <- function(P){
  monomials <- which(P!=0, arr.ind = TRUE) - 1
  kmax <- max(rowSums(monomials))
  allDegrees <- degreesTable(kmax)
  degrees <- row.match(as.data.frame(monomials), allDegrees)
  coefficients <- apply(monomials, 1, function(ijk){ 
    f <- function() P[ijk[1],ijk[2],ijk[3]]
    f()  
  })
  list(degrees=degrees, coefficients=coefficients)
}

> representation(P)
Error in eval(mc) : objet 'ijk' introuvable

Однако трюк работает, когда он не внутри функции. Это работает:

coefficients <- apply(monomials, 1, function(ijk){ 
  f <- function() P[ijk[1],ijk[2],ijk[3]]
  f()  
})

След:

8.
eval(mc) 
7.
eval(mc) 
6.
`[.multipol`(P, ijk[1], ijk[2], ijk[3]) at representation.R#38
5.
P[ijk[1], ijk[2], ijk[3]] at representation.R#38
4.
f() at representation.R#39
3.
FUN(newX[, i], ...) 
2.
apply(monomials, 1, function(ijk) {
    f <- function() P[ijk[1], ijk[2], ijk[3]]
    f()
}) at representation.R#37
1.
representation(P) 

Как мне поступить? Любой трюк? Я не очень понимаю код, который использует eval.parent.

EDIT

Я нашел решение:

  coefficients <- apply(monomials, 1, function(ijk){ 
    ijk <<- ijk
    P[ijk[1],ijk[2],ijk[3]]
  })

Я все еще заинтересован в лучшем решении и объяснении.

EDIT

Проще:

coefficients <- c(P[monomials])

Но мне все еще интересно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...