Я использую ggplot2, и ваш пример, похоже, отлично работает с текущей версией.
Однако, легко найти варианты, которые все еще создают проблемы. Я сам был смущен подобным поведением, и именно так я нашел этот пост (верхний результат Google для «ggplot, как оценивать переменные при передаче»). Например, если мы переместим ggplot из plotfunc:
xy <- data.frame(x=1:10,y=1:10)
plotfunc <- function(Data,YMul=2){
geom_line(aes(x=x,y=y*YMul))
}
ggplot(xy)+plotfunc(xy)
# Error in eval(expr, envir, enclos) : object 'YMul' not found
В приведенном выше варианте «захват локальной среды» не является решением, потому что ggplot не вызывается из функции, и только ggplot имеет аргумент «environment =».
Но теперь существует семейство функций «aes_», «aes_string», «aes_q», которые похожи на «aes», но фиксируют локальные переменные. Если мы используем «aes_» в приведенном выше, мы все равно получаем ошибку, потому что теперь он не знает о «x». Но легко обращаться к данным напрямую, что решает проблему:
plotfunc <- function(Data,YMul=2){
geom_line(aes_(x=Data$x,y=Data$y*YMul))
}
ggplot(xy)+plotfunc(xy)
# works
Data Hygiene - это постоянная битва. Правильный случай никогда не бывает таким простым, как можно подумать. Существуют многочисленные различия и несоответствия при использовании данных из дикой природы.
Вот функция, которая может быть расширена при необходимости.
Полное раскрытие: Есть много других более производительных функций, но они, как правило, имеют упрощенный подход.
Пример
Declare @YourTable table (SomeCol varchar(100))
Insert Into @YourTable values
('old mcdonald'),
('dr. Langdon ,dds'),
('b&o railroad'),
('john-m-smith'),
('CARSON/jACOBS'),
('jAmes o''neil')
Select *
,ProperCase = [dbo].[svf-Str-Proper](SomeCol)
From @YourTable
Возвращает
SomeCol ProperCase
old mcdonald Old McDonald
dr. Langdon ,dds Dr. Langdon ,DDS
b&o railroad B&O Railroad
john-m-smith John-M-Smith
CARSON/jACOBS Carson/Jacobs
jAmes o'neil James O'Neil
UDF, если интересно
[112 ] Для базовых примеров, используя разделитель строк таблицы подсчета, такой как Джеффа Модена, или любую другую функцию разделения, которую вы хотите вместо DelimitedSplit8K()
ниже, вы можете разделить их на пробелы, а затем собрать их обратно вместе после исправления правильного случая. Обратите внимание, что использование этого типа функции разделения быстрее, чем обычно встречающиеся методы RBAR (с циклом и т. Д.).
declare @table table (v varchar(4000))
insert into @table
values
('abc abc abc'),
('Def abc ABC'),
('qrs ABC abc'),
('tuv'),
(' this is an odd-string# that3 has some 435 in it. It has leading and trailing spaces? ')
select distinct
*
,STUFF((
SELECT ' ' + upper(left(lower(rtrim(ltrim(x.Item))),1)) + right(lower(rtrim(ltrim(x.Item))),len(rtrim(ltrim(x.Item))) - 1)
from @table t
cross apply DelimitedSplit8K(rtrim(ltrim(v)),' ') x
where t.v = b.v
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
from @table b