динамически вычислять выражение с помощью eval () и substitute () в R - PullRequest
1 голос
/ 19 апреля 2020

Я хотел бы создать выражение, которое я могу динамически изменить до оценки. Например, в приведенном ниже векторе 'names_test' я хотел бы динамически изменить индекс вектора.

Другими словами, я хотел бы изменить значение 'n' в выражении 'dynamic_expression' так что я могу вернуть n-ый элемент индекса в данном векторе.

Вот некоторый код, чтобы дать контекст для моего вопроса:

#Test data:
names_test <- c("John", "Mary")
names_test[1] # [1] "John"

# Test expression:
dynamic_expression <- expression(names_test[n])
mode(dynamic_expression) # [1] "expression"

# Test cases:
# 1:
eval(dynamic_expression,list(n=1)) # [1] "John"

# 2:
substitute(dynamic_expression,list(n=1)) # dynamic_expression

# 3: 
eval(substitute(dynamic_expression,list(n=1))) # expression(names_test[n])
eval(substitute(dynamic_expression,list(n=1)),list(n=1)) # expression(names_test[n])

# 4:
do.call("substitute", list(dynamic_expression[[1]],env=list(n=1))) # names_test[1]
do.call("substitute", list(dynamic_expression[[1]],env=list(n=2))) # names_test[2]
do.call("substitute", list(dynamic_expression, env=list(n=1))) # expression(names_test[n])

# 5:
dynamic_expression[[1]] #names_test[n]
dynamic_expression #expression(names_test[n])

Вопрос: Тестовый пример # 1 кажется выполненным sh что я хочу, но мой вопрос, почему тестовый пример № 2 не делает то же самое? А также, если возможно, как бы я go изменил тестовый пример # 2, чтобы он возвращал "Джон"?

Поэтому я обновил тестовые случаи, чтобы изучить комментарии к моему исходному сообщению: Тестовый случай № 3 исследует добавление вызова eval (), но это, кажется, не решает так, как я хочу.

Тестовый пример № 4 работает, но я не понимаю, зачем нужен индекс [[ для dynamic_expresison и на что указывает вложенная '1' в 'dynamic_expression [[1]]' Я думаю, что Выражение на самом деле является своего рода списком?

Тестовый пример # 5 может показать, что возвращается, когда индекс [[1]] для динамического_экспрессии сохраняется и исключается.

Любое понимание приветствуется .

...