3

使用 SAS 9.3 并尝试通过定义自定义样式并将其与整个 PROC TEMPLATE 的 statgraph 块中的多个 ENTRY 语句一起使用来遵守DRY 。

自定义样式:

proc template;
define style llama;
    parent=styles.fancyPrinter;
    style CustomFonts from GraphFonts /
        'GraphValueFont'=("<sans-serif>, <MTsans-serif>",25pt,italic)
    ;
    class foo from GraphValueText / 
        font = CustomFonts('GraphValueFont') 
        color = GraphColors('gtext');
end;
run;

然后由 ODS 语句中的 style= 选项打开。我尝试使用 foo:

Entry halign=left "bar / 1000" / textattrs=foo;

但得到日志消息:

注意:选项 TEXTATTRS 中的样式元素 'foo' 无效。将使用默认值。

当使用这样的定义设置 TEXTATTRS 时,它工作正常(但由于我多次使用它,它不会是 DRY):

textattrs=GraphValueText(weight=bold size=16pt color=CX800080)

另外,我知道 ODS 正在阅读样式定义,因为如果我这样做:

style GraphFonts from GraphFonts

并更改字体,它会影响图表。

4

1 回答 1

1

不幸的是,我对如何做到这一点没有一个好的答案,尽管它可能存在。

我确实认为 GTL 并没有完全听你的。例如:

proc template;
define style llama;
    parent=styles.fancyPrinter;
    style CustomFonts from GraphFonts /
        'GraphValueFont'=("<sans-serif>, <MTsans-serif>",25pt,italic)
    ;
    style graphUnicodeText from GraphValueText / 
        color=red;
    style graphValueText from GraphValueText/
        color=green;
end;
run;

proc template;
  define statgraph entry;
    begingraph;
      layout overlay;

        entry halign=right "First entry statement" /
          valign=top textattrs=graphValueText;

        histogram weight;

        entry halign=right "Second entry statement" /
            textattrs=graphUnicodeText;

        entry halign=right "Third entry statement" /
          valign=bottom pad=(bottom=40px);

      endlayout;
    endgraph;
  end;
run;

ods _all_ close;
ods html file="c:\temp\test.html" path="" gpath="c:\temp\" style=llama;
proc sgrender data=sashelp.class template=entry;
run;
ods html close;

请注意,您不会收到有关 GraphUnicodeText 的任何错误...但您也不会从中获得任何影响。我的猜测是,GTL 在做它的工作时只对风格有部分认识,因此不能总是尊重你要求它做的事情。

我的建议(至少直到/除非 Sanjay 或 Dan 或类似的可以帮助您找到更好的)是为此目的使用宏变量和/或动态变量。

proc template;
define style llama;
    parent=styles.fancyPrinter;
    style CustomFonts from GraphFonts /
        'GraphValueFont'=("<sans-serif>, <MTsans-serif>",25pt,italic)
    ;
    style graphUnicodeText from GraphValueText / 
        color=red;
    style graphValueText from GraphValueText/
        color=green;
end;
run;

proc template;
  define statgraph entry;
    begingraph;
      layout overlay;
        dynamic entrycolor;

        entry halign=right "First entry statement" /
          valign=top;

        histogram weight;

        entry halign=right "Second entry statement" /
            textattrs=(color=entrycolor);

        entry halign=right "Third entry statement" /
          valign=bottom pad=(bottom=40px);

      endlayout;
    endgraph;
  end;
run;

ods _all_ close;
ods html file="c:\temp\test.html" path="" gpath="c:\temp\" style=llama;
proc sgrender data=sashelp.class template=entry;
dynamic entrycolor="red";
run;
ods html close;

然后,您可以entrycolor在模板中的多个位置重用,并允许用户在运行时指定它。这并不理想,但它确实有效,至少......

于 2015-08-06T22:01:20.990 回答