Ошибка: цель назначения расширяется до неязыкового объекта при использовании eval (parse ()) - PullRequest
0 голосов
/ 19 сентября 2019

Пример данных

df <- structure(list(Date = structure(c(15706, 15707, 15708, 15709, 
15712, 15713, 15714, 15715, 15716, 15719), class = "Date"), MidPrs_JPY = c(NA, 
NA, NA, 0.00102, 0.00102, 0.00102, 0.00102, 0.00102, 0.00102, 
NA), BID_EUR = c(NA, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 
2e-04, 2e-04, 2e-04), ASK_EUR = c(NA, -2e-04, -3e-04, -7e-04, 
-3e-04, -4e-04, -4e-04, -7e-04, -5e-04, -5e-04), BID_GBP = c(NA, 
0.0048, 0.0048, 0.0048, 0.0048, 0.0048, 0.0048, 0.0048, 0.0048, 
0.0048), ASK_GBP = c(NA, 0.0042, 0.0042, 0.0042, 0.0042, 0.0042, 
0.0042, 0.0042, 0.0042, 0.0042), BID_USD = c(0.0034, 0.0034, 
0.0034, 0.0034, 0.0034, 0.0034, 0.0034, 0.0034, 0.0034, 0.0034
), ASK_USD = c(0.003, 0.003, 0.003, 0.003, 0.003, 0.003, 0.003, 
0.003, 0.003, 0.003)), row.names = c(NA, 10L), class = "data.frame")

namesV <- c("EUR", "GBP", "USD")

Вопрос

При игре с eval(parse(...)) во время написания цикла я заметил, что это не таквозможность назначить оператору, полученному в результате eval(parse(...)).Это не имеет смысла для меня, поскольку с помощью этого метода можно вызывать столбец, но, очевидно, нельзя назначать новые значения.

Что я имею в виду, не имея возможности назначить, но вызывая:

eval(parse(text = paste0("RepoCal$BID_", namesV[1])))

Позволяет мне вызывать столбец, однако:

eval(parse(text = paste0("Repomid$MidPrs_", namesV[1]))) <- eval(parse(text = paste0("Repomid$MidPrs_", namesV[2])))

приводит к ошибке:

цель назначения расширяется до неязыкового объекта

Я благодарен за любые советы, которые помогут мне понять основную проблему или даже решить ее, спасибо!

1 Ответ

1 голос
/ 19 сентября 2019

Сообщение об ошибке неясно, но это говорит нам о том, что вы не можете выполнять присваивания произвольным выражениям.eval(parse(…)) не является именем , вы не можете его присвоить. 1

Для фундаментальной проблемы, которую вы хотите решить, ничего этого не требуетсяК счастью (потому что в противном случае вы были бы в правильном рассоле).Вместо этого вам нужно выполнить [[ подмножество, а не $ подмножество:

Repomid[[paste0('MidPrs_', namesV[1L])]] <- Repomid[[paste0('MidPrs_', namesV[2L])]]

Проще говоря, синтаксическая форма foo[['bar']] (более или менее) эквивалентна foo$bar, где bar - строка в кавычках в первом выражении, но имя без кавычек во втором.


1 Это (довольно много) сложнее, потому что вы может присваивать выражения в R, которые не являются чистыми именами.Но в конечном итоге им всем нужно как-то разрешить имя.Выше не делает.Но даже если бы это было так, это, вероятно, не сработало бы так, как вы ожидаете, потому что вы пытаетесь присвоить результат этого eval вызова.И результатом этого eval вызова является значение , а не имя .R принципиально не позволяет присваивать значения.

...