Я пытаюсь преобразовать следующую функцию в удобную для канала функцию. Но он состоит из струн. Я не уверен, с чего начать.
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")
Большой. Можно ли разделить функцию mplusObject
на несколько функций, чтобы использовать ее в качестве каналов?
Тогда вам нужно создать разные функции для каждого из них. Я думаю, что ответ мистера Флика показывает вам, как это сделать.
Если вы хотите иметь функцию pipable, вам понадобится объект pipeble. Здесь мы просто записываем значения в список. Что-то вроде
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, "/n", 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
объект.
Ввод
pathmodel
возвращает>Error in summary.mplusObject(x) : isFALSE(is.null(object$results)) is not TRUE
. Pipes используются для упорядоченного объединения нескольких функций. Нет никаких функций, называемыхon
,output
и т. д., которые вы могли бы передать. Это аргументы только одной функции, то естьmplusObject
. Вы не можете передать аргументы.