Вам не хватает того факта, что col1
и col2
не существуют ни в dataframe
(из вашего), ни в рабочей области пользователя.
В основном with()
и within()
работают так:
> foo <- 10
> bar <- data.frame(FOO = 10)
> FOO + foo
Error: object 'FOO' not found
> with(bar, FOO + foo)
[1] 20
В первом случае FOO
не был найден, поскольку он находится внутри bar
. Во втором случае мы устанавливаем среду, в которой оценивается наше выражение. Внутри этой среды FOO
существует. foo
также находится в рабочей области.
В вашем первом примере (пожалуйста, не редактируйте сообщения об ошибках и т. Д., Покажите нам точно, какой код вы запустили и какую ошибку вызвали) либо один col1
, либо col2
не существовал в среде, созданной для Выражение было оценено.
Кроме того, вы хотите сохранить в col1
и col2
имя столбца (компонента) вашего dataframe
. DWin показал вам один из способов использования этой информации. Альтернатива, поддерживающая использование within()
, заключается в использовании get()
следующим образом:
res <- within(dataframe, somenewcol <- paste(get(col1), "-", get(col2), sep=""))
Почему это работает, согласно вашим дополнительным изменениям и затруднениям, в том, что get()
возвращает объект с именем по его первому аргументу. get("foo")
вернет объект с именем foo
(продолжение моего примера выше):
get ("foo") ## находит foo и возвращает его
1 10
В вашем примере у вас есть фрейм данных с именами среди прочего "col1"
и "col2"
. Вы изменили свой код на get(arg1)
(где arg1 <- "col1"
), где вы просите get()
вернуть объект с именем "col1"
из среды оценки, видимой во время оценки вашей функции. Так как ваш dataframe
содержал компонент col1
, который был видим, потому что within()
сделал его доступным, get()
смог найти объект с требуемым именем и включить его в выражение.
Но в этот момент вы пытаетесь прыгнуть через слишком много обручей, потому что ваши вопросы не были конкретными. Я предполагаю, что вы спрашиваете об этом из-за моего ответа здесь на ваш предыдущий вопрос. Этот ответ предложил лучшую альтернативу, чем attach()
. Но вам не было ясно, каковы были некоторые аргументы или что вы действительно хотели сделать. Если бы я знал сейчас, что вы действительно хотите сделать, я бы предложил вам использовать ответ DWin выше.
Похоже, вы не хотите жестко кодировать имена столбцов / компонентов. Если бы вы могли написать жесткий код, это было бы решением:
res <- within(dataframe, somenewcol <- paste(col1, "-", col2, sep = ""))
Но если вы не хотите писать жесткий код, вам нужна версия get()
или решение DWin.