Assign 朱莉娅:分配和获取函数

Assign 朱莉娅:分配和获取函数,assign,julia,Assign,Julia,我希望能够通过一个简单的字符串循环为Julia中的变量赋值 例如: x1, x2, x3, x4 = 14, 12, 34, 19 letters = "abcd" for i in 1:4 val = get("x$i") var = letters[i] assign(var, val) end a 14 注意,我选择函数“assign”和“get”,因为我在R中已经习惯了它们 我之所以要这样做,是因为我有一个函数,它接受多个参数,这些参数的计算结果是相同的,我认为复制代码

我希望能够通过一个简单的字符串循环为Julia中的变量赋值

例如:

x1, x2, x3, x4 = 14, 12, 34, 19
letters = "abcd"

for i in 1:4
  val = get("x$i")
  var = letters[i]
  assign(var, val)
end

a
14
注意,我选择函数“assign”和“get”,因为我在R中已经习惯了它们

我之所以要这样做,是因为我有一个函数,它接受多个参数,这些参数的计算结果是相同的,我认为复制代码没有意义。比如:

function f(a,b,c,d) 

  if a<0 a==-9999 end
  if b<0 b==-9999 end
  if c<0 c==-9999 end
  if d<0 d==-9999 end

end
函数f(a,b,c,d)

如果a要在Julia中执行这种奇怪的动态变量trixing,必须使用宏和元编程。它的要点是一个非常强大的代码生成接口。我认为可以在表单上编写一个与上述代码相同的宏

x1, x2, x3, x4 = 14, 12, 34, 19
@assign("abcd", 1:4)
并将“编译时”转换为

编写和调试这样的宏需要一些时间。您能描述一下您的用例吗,这样我就可以知道是否有一些约束实际上并不重要,或者您想要更多的功能?例如,
1:4
似乎是多余的,因为我可以在enumerate(“abcd”)
中使用
for(I,字母)来获得相同的循环。

这样做的技巧是:

x1, x2, x3, x4 = 14, 12, 34, 19
letters = "abcd"

for i  in 1:4
    assignment = parse("$(letters[i]) = x$(i)")
    eval(assignment)
end
您可以阅读有关
parse
函数的内容,该函数将字符串转换为表达式,如下所示:

在你提出第二个建议之后,我想你可能真的想要这样的东西

function f(args...)
    acc = zero(args[1])
    for a in args
        if a < 0
            acc -= 9999
        else
            acc += a
        end
    end
    acc
end
函数f(参数…)
acc=零(参数[1])
对于args中的
如果a<0
acc-=9999
其他的
acc+=a
结束
结束
行政协调会
结束

用法就像

出于好奇,您认为这比使用数组或dict有什么好处?不推荐使用这种方法。正如答案所示,这是可以做到的,但这不是一个很好的主意。你绝对应该做后一种尝试。我修正了它,这样语法就正确了,它就可以运行了。编辑这个问题是为了提供更多的动力。我喜欢这个!唯一的诀窍是,我真的会有一些参数采用相同的值,而有些参数不采用相同的值,但我非常确定我可以很容易地修改这个代码
函数f(a=1,b=2,c=3,d=4,printout=true);acc=(a,b,c,d)。当我们使用玩具示例时,很难为您的问题找到正确的解决方案,这些示例可能与您的实际问题有相同的解决方案,也可能与您的实际问题没有相同的解决方案。很高兴我能帮上忙:)
x1, x2, x3, x4 = 14, 12, 34, 19
letters = "abcd"

for i  in 1:4
    assignment = parse("$(letters[i]) = x$(i)")
    eval(assignment)
end
function f(args...)
    acc = zero(args[1])
    for a in args
        if a < 0
            acc -= 9999
        else
            acc += a
        end
    end
    acc
end