Можете ли вы ссылаться на массив динамически, используя значение строки? [Дубликат]

lw<- function(x){length(which(df$variable==someValue))}

agg<- aggregate(Var1~Var2+Var3, data=df, FUN=lw)

names(agg)<- c("Some", "Pretty", "Names", "Here")

View(agg)
4
задан hradecek 7 February 2012 в 22:04
поделиться

7 ответов

Нет, вы не можете, и нет никакого смысла честно иметь такую ​​особенность.

Если вам нужно динамически назначать некоторые данные с ключом и значением, вы можете использовать словарь:

Dictionary<string, RectangleShape> shapes = new Dictionary<string, RectangleShape>();
shapes.Add("matrix1_2", new RectangleShape( ... ));

Тогда вы можете просто прочитать «переменную», например

shapes["matrix1_2"]
8
ответ дан Denis Biondic 22 August 2018 в 02:02
поделиться
  • 1
    Получил это ... Я люблю тебя! ... Мне нужно это! ... Большое спасибо! – hradecek 7 February 2012 в 22:14
  • 2
    Нет проблем ...: =) – Denis Biondic 7 February 2012 в 22:19
  • 3
    @hradecek Если вы чувствуете, что на ваш вопрос был дан ответ, вы можете & quot; принять & quot; нажав на контрольный знак слева от ответа. – ispiro 7 February 2012 в 22:57

Вы могли бы с отражением, но я подозреваю, что в этом случае theere - лучший дизайн, который вы могли бы реализовать, это было бы лучше, чем использование рефлексии.

Объявите переменную словаря:

Dictionary<string, RectangleShape> rectangleDictionary = new Dictionary<string, RectangleShape>();

Затем, где вы бы указали нормальный текст «matrix1_2 = somevalue ; "вместо этого напишите:

rectangleDictionary.add("matrix1_2", somevalue)

Тогда вы сможете работать с именем переменной:

rectangleDictionary["matrix1_2"] = someothervalue;
rectangleDictionary["matrix1_2"].someproperty = something;

Microsoft.VisualBasic.PowerPacks.RectangleShape y = rectangleDictionary["matrix1_2"]; 
0
ответ дан Brandon Moore 22 August 2018 в 02:02
поделиться
  • 1
    Вероятно, есть способ сделать то, что вы хотите, используя словарь & lt; & gt; объект для хранения ключей и значений. – Brandon Moore 7 February 2012 в 22:08
  • 2
    Отражение не допускает доступ к переменным внутри метода: только методы, поля, типы и свойства. – StriplingWarrior 7 February 2012 в 22:08
  • 3
    @StriplingWarrior Это, безусловно, усложняет этот вопрос, хотя это, вероятно, можно обойти ... определенно не стоит работать, хотя я уверен, что для его проблемы есть лучшие варианты. – Brandon Moore 7 February 2012 в 22:19

Кажется, плохая идея. Попробуйте использовать перечисления или собственные типы данных / классы

0
ответ дан chrs 22 August 2018 в 02:02
поделиться

Уже существует ли «matrix1_2»? Другими словами, когда вы говорите y = ??? вы пытаетесь получить доступ к существующей переменной или создать ее.

Насколько я знаю, нет способа создать новый экземпляр «named» во время выполнения. Однако вы можете получить имена существующих полей и выбрать их с помощью System.Reflection.

String x = "matrix1_2";
Microsoft.VisualBasic.PowerPacks.RectangleShape y;
Type type = typeof(MyType); // Get type pointer
FieldInfo[] fields = type.GetFields();
foreach (var field in fields)
{
        if (field.Name == "matrix1_2")
        {
            y = field;
        }
}

MyType выше - это имя любого класса matrix1_2.

0
ответ дан Justin 22 August 2018 в 02:02
поделиться
  • 1
    Что, если matrix1_2 не находится в классе, это просто переменная в методе? – McKay 7 February 2012 в 22:47
  • 2
    @McKay - Я не верю, что имена переменных сохраняются внутри метода. Как только вы скомпилируете байт-код CIL, на них ссылаются по позиции (например, V_0, V_1, V_2 и т. Д.), И любое имя, которое вы им дали, теряется. Таким образом, даже если бы вы могли динамически создавать новую локальную переменную, для обращения к ней в ваших программах на C # понадобилось бы немного глубокой магии. Возможно, вы сможете использовать AOP (возможно, с помощью PostSharp – Justin 20 February 2012 в 20:34
  • 3
    Это точно моя точка зрения. Он хочет получить доступ к теоретически произвольной переменной. Если это поле, этот код будет работать, если это свойство, другой код будет работать, если это параметр, другой код может работать. У вас нет очень обобщенного решения. – McKay 21 February 2012 в 16:50

Таким образом вы можете получить значение поля из динамического типа (используя C # в проекте Silverlight 5).

Type itemType = item.GetType();
try
{
    PropertyInfo field = itemType.GetProperty(fieldName);
    object val = field.GetValue(item, null);
}
catch (Exception ex)
{
    // field doesn't exist, do something else
}

* Где «элемент» - это динамический тип, сгенерированный во время выполнения (но не обязательно), а «fieldName» - это строка для имени свойства, которое вы ищете.

0
ответ дан justin.staffer 22 August 2018 в 02:02
поделиться

Нет, это не так. Если «matrix1_2» - это локальная переменная, то вы не можете сделать это, поскольку переменная может даже не существовать после завершения компилятора, если это фактически поле экземпляра, тогда отражение может помочь:

object value = obj.GetType().GetField(fieldName).GetValue(obj);
2
ответ дан Marc Gravell 22 August 2018 в 02:02
поделиться

Это невозможно.

Вы не можете иметь имена динамических переменных в C #, VB.NET или любом языке .NET. Поддержка такой функции отсутствует.

1
ответ дан Oded 22 August 2018 в 02:02
поделиться
  • 1
    Roslyn поддерживает переменный доступ, подобный этому, но кроме этого, это правильно. – McKay 7 February 2012 в 22:06
  • 2
    @McKay - Рослин - совсем другое дело. Это не C #. – Oded 7 February 2012 в 22:07
  • 3
    @Oded, это, конечно, не лучший способ сделать это, я не думаю, но если он знает, какая сборка содержит переменная, он должен иметь возможность использовать отражение, верно? – Brandon Moore 7 February 2012 в 22:08
  • 4
    @Oded Я не думал, что он хочет объявить переменную во время выполнения, но просто получить к ней доступ по имени во время выполнения. Может быть, я не понимаю вопрос, хотя ... – Brandon Moore 7 February 2012 в 22:11
  • 5
    @BrandonMoore - Он, вероятно, просто нуждается в коллекции, но не знает, как это выразить. – Oded 7 February 2012 в 22:18
Другие вопросы по тегам:

Похожие вопросы: