微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将函数转换为管道友好函数?

如何解决如何将函数转换为管道友好函数?

我正在尝试将以下函数转换为对管道友好的函数。但它是由字符串组成的。我不知道从哪里开始。

library(MplusAutomation)

pathmodel <- mplusObject(
   TITLE = "MplusAutomation Example - Path Model;",MODEL = "
     mpg ON hp;
     wt by disp drat;",OUTPUT = "CINTERVAL;",rdata = mtcars)

我已经尝试过这种格式,但我不确定哪个不起作用,我不确定如何创建它以便它与管道一起工作。

mplus <- function(data,title,on,by,output) {
  mplusObject(TITLE = as.character(title),MODEL = paste(on,"/n",by),OUTPUT = as.character(output),rdata = data)
  
}

这就是我最终想要达到的目标。

mplus %>%
  data(mtcars) %>%
  title("example - path model") %>%
  predictors("mpg on hp") %>%
  latentvars("wt by disp drat") %>%
  output(cinterval)

解决方法

这就是你可以做的来使这个函数动态化:

mplus <- function(data,title,on,by,output) {
  mplusObject(TITLE = title,MODEL = paste(on,"/n",by),OUTPUT = output,rdata = data)
}

然后将其称为:

mtcars %>%
  mplus("example - path model","mpg on hp","wt by disp drat","CINTERVAL")
,

如果你想拥有 pipable 功能,那么你需要一个 pipeble 对象。在这里,我们只是存储 a 列表中的值。类似的东西

new_mplus <- function(data=NA) {
  x <- list(TITLE=NA,MODEL=NA,OUTPUT=NA,predictors=NA,latent=NA,rdata=data)
  class(x) <- "mplus"
  x
}

is_mplus <- function(x) {
  "mplus" %in% class(x)
}

mplus <- function(data) {
  stopifnot(is.data.frame(data))
  new_mplus(data)
}

title <- function(x,title) {
  stopifnot(is_mplus(x))
  x$TITLE <- title
  x
}

predictors <- function(x,predictors) {
  stopifnot(is_mplus(x))
  x$predictors <- predictors
  x
}

latentvars <- function(x,latent) {
  stopifnot(is_mplus(x))
  x$latent <- latent
  x
}

output <- function(x,output) {
  stopifnot(is_mplus(x))
  x$OUTOUT <- output
  x
}

然后你用

调用它
mtcars %>%
  mplus() %>%
  title("example - path model") %>%
  predictors("mpg on hp") %>%
  latentvars("wt by disp drat") %>%
  output("cinterval")

该列表将记录您的所有价值观。然后你只需要有一个函数来执行它

execute <- function(x) {
  mplusObject(TITLE = x$TITLE
              MODEL = paste(x$predictors,x$latent),OUTPUT = x$OUTPUT,rdata = x$data)
}

mtcars %>%
  mplus() %>%
  title("example - path model") %>%
  predictors("mpg on hp") %>%
  latentvars("wt by disp drat") %>%
  output("cinterval") %>% 
  execute()

管道都是关于将对象从一个函数传递到下一个函数,因此您需要某种对象来传递以存储所有值。使用 dplyr 传递一个 tibble,使用 ggplot2 创建一个 ggplot 对象。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。