Я согласен с @Roland, что это не та вещь, которую вы хотите использовать в пакете для других пользователей. Однако, как упражнение в понимании нестандартной оценки, вы можете попробовать что-то вроде следующего:
Во-первых, мне нужно определить функцию keys
, которая должна быть оценена в add
, так как у вас нет не предоставил это в вашем вопросе. Я сделаю так, чтобы он просто возвращал именованный вектор, который будет храниться в среде data
keys <- function(ID = NULL, OWNER = NULL, DATE = NULL, ROOM = NULL)
{
c(ID = ID, OWNER = OWNER, DATE = DATE, ROOM = ROOM)
}
И, конечно, нам нужна среда с именем data
data <- new.env()
Теперь не совсем понятно, каков ваш ожидаемый ввод и вывод. Я предполагаю, что если пользователь вводит объект, который не существует, вы просто хотите сохранить его имя, но если он вводит объект, который существует, он хочет, чтобы значение этой переменной было сохранено. Если они вводят символьную строку, она должна быть просто сохранена как есть.
add <- function(id, name, date, room)
{
if(!class(substitute(id)) == "character")
if(!exists(deparse(substitute(id))))
id <- deparse(substitute(id))
if(!class(substitute(name)) == "character")
if(!exists(deparse(substitute(name))))
name <- deparse(substitute(name))
if(!class(substitute(date)) == "character")
if(!exists(deparse(substitute(date))))
date <- deparse(substitute(date))
if(!class(substitute(room)) == "character")
if(!exists(deparse(substitute(room))))
room <- deparse(substitute(room))
command <- bquote(keys(ID = .(id),
OWNER = .(name),
DATE = .(date),
ROOM = .(room)))
assign(id, eval(command), envir = data)
}
Итак, давайте создадим существующую переменную, которую пользователь может ввести
x <- "ID_1"
Так что теперь, когда вы вызовите вашу командную строку и введите
--> add(x, me, "x", room1)
Вы найдете свои переменные, хранящиеся в среде data
, например:
#> data$ID_1
#> ID OWNER DATE ROOM
#> "ID_1" "me" "x" "room1"
Принимая во внимание, что если x не существует, вы получите это :
data$x
#> ID OWNER DATE ROOM
#> "x" "me" "x" "room1"