Параметры разбора, переданные в функцию при вводе пользователем - PullRequest
0 голосов
/ 29 января 2020

Я написал командную строку в R, где пользователь может добавлять S4-объекты.

Проблема в том, что я хочу преобразовать каждый параметр команды, которую пользователь вводит в строку символов.

Например, у меня есть команда add (), пользователь может войти. Функция add добавит информацию в виде S4-объекта.

add("id", "name", "date", "room")

add <- function(id, name, date, room){

command <- parse(text = "keys(ID = id, OWNER = name, DATE = date, ROOM = room)")
assign(id, eval(command), envir = data)

}    

input <- readline(prompt = "--> ")
eval(parse(text = input))

Если пользователь вводит что-то вроде

add(foo, "foo", "foo", "foo")

или даже

add(foo, foo, foo, foo)

Это приведет к ошибке, потому что вход будет обрабатываться как объект:

Error in add(foo, "foo", "foo", "foo") : object 'foo' not found

Любые рекомендации?

1 Ответ

1 голос
/ 29 января 2020

Я согласен с @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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...