Присвоение списку с использованием трубы в R - PullRequest
0 голосов
/ 05 июня 2018

Использование канала %test% Я бы хотел присвоить rhs вывод lhs, когда lhs является элементом списка, но, как вы можете видеть, создается новая переменная, а вывод rhs не назначается lhs (все еще NULL):

> test.list <- list(val = NULL)
> test.list$val %test% head(mtcars)
> `test.list$val`
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
> test.list$val
NULL

MWE:

`%test%` <- function(lhs, rhs) {
  target <- substitute(lhs)
  val <- substitute(rhs)
  envir <- parent.frame()
  val.eval <- eval(val, envir = envir)
  assign(deparse(target), val.eval, envir = envir)
}

test.list <- list(val = NULL)
test.list$val %test% head(mtcars)
`test.list$val`
test.list$val

1 Ответ

0 голосов
/ 05 июня 2018

Это работает, но я не утверждаю, что это чисто :):

'%test%' <- function(lhs, rhs) {
  target <- sub("^(.*?)(\\$.*)","\\1",deparse(substitute(lhs)))
  elt    <- sub("^(.*?\\$)(.*)","\\2",deparse(substitute(lhs)))
  val <- substitute(rhs)
  envir <- parent.frame()
  val.eval <- eval(val, envir = envir)
  target.eval <- eval(lhs, envir = envir)
  target.eval[[elt]] <- val.eval
  assign(target, target.eval, envir = envir)
}

test.list <- list(val = NULL)
test.list$val %test% head(mtcars)
# $val
# mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
# Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
# Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
# Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
# Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
...